diff options
Diffstat (limited to 'test/rep045script.tcl')
-rw-r--r-- | test/rep045script.tcl | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/test/rep045script.tcl b/test/rep045script.tcl new file mode 100644 index 0000000..966760e --- /dev/null +++ b/test/rep045script.tcl @@ -0,0 +1,142 @@ +# See the file LICENSE for redistribution information. +# +# Copyright (c) 2005-2009 Oracle. All rights reserved. +# +# $Id$ +# +# Rep045 script - replication with version dbs. +# +# Usage: rep045script clientdir vfile +# clientdir: client env directory +# vfile: name of version file +# +source ./include.tcl +source $test_path/test.tcl +source $test_path/testutils.tcl +source $test_path/reputils.tcl + +set usage "repscript clientdir vfile" + +# Verify usage +if { $argc != 3 } { + puts stderr "FAIL:[timestamp] Usage: $usage" + exit +} + +# Initialize arguments +set clientdir [ lindex $argv 0 ] +set vfile [ lindex $argv 1 ] +global databases_in_memory +set databases_in_memory [ lindex $argv 2 ] +set niter 50 + +# Join the queue env. We assume the rep test convention of +# placing the messages in $testdir/MSGQUEUEDIR. +set queueenv [eval berkdb_env -home $testdir/MSGQUEUEDIR] +error_check_good script_qenv_open [is_valid_env $queueenv] TRUE + +# We need to set up our own machids. +repladd 3 + +# Join the client env. +set cl_cmd "berkdb_env_noerr -home $clientdir \ + -txn -rep_client -rep_transport \[list 3 replsend\]" +# set cl_cmd "berkdb_env_noerr -home $clientdir \ +# -verbose {rep on} -errfile /dev/stderr \ +# -txn -rep_client -rep_transport \[list 3 replsend\]" +set clientenv [eval $cl_cmd] +error_check_good script_cenv_open [is_valid_env $clientenv] TRUE + +# Start up deadlock detector. +set dpid [exec $util_path/db_deadlock \ + -a o -v -t 5 -h $clientdir >& $testdir/dd.out &] + +# Initialize version number. Don't try to open the first +# version database until the master has completed setting it up. +set version 0 +while {[catch {berkdb_open_noerr -env $clientenv -rdonly $vfile} vdb]} { + puts "FAIL: vdb open failed: $vdb" + tclsleep 1 +} + +while { $version == 0 } { + tclsleep 1 + if { [catch {$vdb get VERSION} res] } { + # If we encounter an error, check what kind of + # error it is. + if { [is_substr $res DB_LOCK_DEADLOCK] == 1 } { + # We're deadlocked. Just wait for the + # deadlock detector to break the deadlock. + } elseif { [is_substr $res DB_REP_HANDLE_DEAD] == 1 } { + # Handle is dead. Get a new handle. + error_check_good vdb_close [$vdb close] 0 + set vdb [eval berkdb_open -env $clientenv\ + -rdonly $vfile] + } else { + # We got something we didn't expect. + puts "FAIL: Trying to get version, got $res" + break + } + } else { + # No error was encountered. + set version [lindex [lindex $res 0] 1] + } +} +error_check_good close_vdb [$vdb close] 0 +set dbfile db.$version + +# Open completed database version $version. +if {[catch {berkdb_open -rdonly -env $clientenv $dbfile} db]} { + puts "FAIL: db open failed: $db" +} +error_check_good db_open [is_valid_db $db] TRUE + +# While parent process is not done, read from current database. +# Periodically check version and update current database when +# necessary. +while { 1 } { + set dbc [$db cursor] + set i 0 + error_check_good cursor_open [is_valid_cursor $dbc $db] TRUE + for { set dbt [$dbc get -first] } { $i < $niter } \ + { set dbt [$dbc get -next] } { + incr i + } + error_check_good cursor_close [$dbc close] 0 + + while {[catch {berkdb_open -env $clientenv -rdonly $vfile} vdb]} { + puts "open failed: vdb is $vdb" + tclsleep 1 + } + set ret [$vdb get VERSION] + + set newversion [lindex [lindex $ret 0] 1] + error_check_good close_vdb [$vdb close] 0 + error_check_bad check_newversion $newversion "" + if { $newversion != $version } { + if { $newversion == "DONE" } { + break + } elseif { $newversion == 0 } { + puts "FAIL: version has reverted to 0" + continue + } else { + error_check_good db_close [$db close] 0 + set version $newversion + set dbfile db.$version + while {[catch \ + {berkdb_open -env $clientenv -rdonly $dbfile} db]} { + puts "db open of new db failed: $db" + tclsleep 1 + } + error_check_good db_open [is_valid_db $db] TRUE + } + } + + # Pause a few seconds to allow the parent to do some work. + tclsleep 3 +} + +# Clean up. +error_check_good kill_deadlock_detector [tclkill $dpid] "" +error_check_good db_close [$db close] 0 +error_check_good script_client_close [$clientenv close] 0 |