source ./include.tcl
source $test_path/test.tcl
source $test_path/testutils.tcl
source $test_path/reputils.tcl
set usage "repscript clientdir vfile"
if { $argc != 2 } {
puts stderr "FAIL:[timestamp] Usage: $usage"
exit
}
set clientdir [ lindex $argv 0 ]
set vfile [ lindex $argv 1 ]
set niter 50
set queueenv [eval berkdb_env -home $testdir/MSGQUEUEDIR]
error_check_good script_qenv_open [is_valid_env $queueenv] TRUE
repladd 3
set cl_cmd "berkdb_env_noerr -home $clientdir \
-txn -rep_client -rep_transport \[list 3 replsend\]"
set clientenv [eval $cl_cmd]
error_check_good script_cenv_open [is_valid_env $clientenv] TRUE
set dpid [exec $util_path/db_deadlock \
-a o -v -t 5 -h $clientdir >& $testdir/dd.out &]
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 { [is_substr $res DB_LOCK_DEADLOCK] == 1 } {
} elseif { [is_substr $res DB_REP_HANDLE_DEAD] == 1 } {
error_check_good vdb_close [$vdb close] 0
set vdb [eval berkdb_open -env $clientenv\
-rdonly $vfile]
} else {
puts "FAIL: Trying to get version, got $res"
break
}
} else {
set version [lindex [lindex $res 0] 1]
}
}
error_check_good close_vdb [$vdb close] 0
set dbfile db.$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 { 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
}
}
tclsleep 3
}
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