proc rep021 { method { nclients 3 } { tnum "021" } args } {
source ./include.tcl
if { $is_windows9x_test == 1 } {
puts "Skipping replication test on Win 9x platform."
return
}
if { $checking_valid_methods } {
return "ALL"
}
global mixed_mode_logging
if { $mixed_mode_logging > 0 } {
puts "Rep$tnum: Skipping for mixed-mode logging."
return
}
set args [convert_args $method $args]
set logsets [create_logsets [expr $nclients + 1]]
foreach r $test_recopts {
foreach l $logsets {
set logindex [lsearch -exact $l "in-memory"]
if { $r == "-recover" && $logindex != -1 } {
puts "Rep$tnum: Skipping\
for in-memory logs with -recover."
continue
}
puts "Rep$tnum ($method $r):\
Replication and $nclients recovered clients in sync."
puts "Rep$tnum: Master logs are [lindex $l 0]"
for { set i 0 } { $i < $nclients } { incr i } {
puts "Rep$tnum: Client $i logs are\
[lindex $l [expr $i + 1]]"
}
rep021_sub $method $nclients $tnum $l $r $args
}
}
}
proc rep021_sub { method nclients tnum logset recargs largs } {
global testdir
global util_path
global rep_verbose
global verbose_type
set verbargs ""
if { $rep_verbose == 1 } {
set verbargs " -verbose {$verbose_type on} "
}
set orig_tdir $testdir
env_cleanup $testdir
replsetup $testdir/MSGQUEUEDIR
set niter 100
set offset 5
set masterdir $testdir/MASTERDIR
set masterdir2 $testdir/MASTERDIR.NEW
file mkdir $masterdir
file mkdir $masterdir2
set m_logtype [lindex $logset 0]
set m_logargs [adjust_logargs $m_logtype]
set m_txnargs [adjust_txnargs $m_logtype]
repladd 10
set ma2_envcmd "berkdb_env_noerr -create $m_txnargs $verbargs \
$m_logargs -home $masterdir2 \
-rep_master -rep_transport \[list 10 replsend\]"
set menv2 [eval $ma2_envcmd $recargs]
set clientdir2 $testdir/CLIENTDIR.NEW
file mkdir $clientdir2
set id2 11
set c_logtype($id2) [lindex $logset 1]
set c_logargs($id2) [adjust_logargs $c_logtype($id2)]
set c_txnargs($id2) [adjust_txnargs $c_logtype($id2)]
set id2 11
repladd $id2
set cl2_envcmd "berkdb_env_noerr -create $c_txnargs($id2) $verbargs \
$c_logargs($id2) -home $clientdir2 \
-rep_client -rep_transport \[list $id2 replsend\]"
set clenv2 [eval $cl2_envcmd $recargs]
set testfile "test$tnum.db"
set omethod [convert_method $method]
set masterdb2 [eval {berkdb_open_noerr -env $menv2 -auto_commit \
-create -mode 0644} $largs $omethod $testfile]
error_check_good dbopen [is_valid_db $masterdb2] TRUE
set env2list {}
lappend env2list "$menv2 10"
lappend env2list "$clenv2 $id2"
process_msgs $env2list
set e1phase1 0
set e2phase1 $offset
set e1phase2 [expr $niter + $offset]
set e2phase2 $e1phase2
set e1phase3 [expr $e1phase2 + $niter]
set e2phase3 [expr $e2phase2 + $niter + $offset]
puts "\tRep$tnum.a: Running rep_test in 2nd replicated env."
eval rep_test $method $menv2 $masterdb2 $niter $e2phase1 1 1 0 $largs
eval rep_test $method $menv2 $masterdb2 $niter $e2phase2 1 1 0 $largs
eval rep_test $method $menv2 $masterdb2 $niter $e2phase3 1 1 0 $largs
error_check_good mdb_cl [$masterdb2 close] 0
process_msgs $env2list
puts "\tRep$tnum.b: Close 2nd replicated env. Open primary."
error_check_good mdb_cl [$clenv2 close] 0
error_check_good mdb_cl [$menv2 close] 0
replclose $testdir/MSGQUEUEDIR
set stat [catch {eval exec $util_path/db_recover -h $clientdir2} result]
error_check_good stat $stat 0
replsetup $testdir/MSGQUEUEDIR
repladd 1
set ma_envcmd "berkdb_env_noerr -create $m_txnargs $verbargs \
$m_logargs -home $masterdir \
-rep_master -rep_transport \[list 1 replsend\]"
set menv [eval $ma_envcmd $recargs]
for {set i 0} {$i < $nclients} {incr i} {
set clientdir($i) $testdir/CLIENTDIR.$i
file mkdir $clientdir($i)
set c_logtype($i) [lindex $logset [expr $i + 1]]
set c_logargs($i) [adjust_logargs $c_logtype($i)]
set c_txnargs($i) [adjust_txnargs $c_logtype($i)]
set id($i) [expr 2 + $i]
repladd $id($i)
set cl_envcmd($i) "berkdb_env_noerr -create $c_txnargs($i) \
$c_logargs($i) -home $clientdir($i) \
$verbargs \
-rep_client -rep_transport \[list $id($i) replsend\]"
set clenv($i) [eval $cl_envcmd($i) $recargs]
}
set masterdb [eval {berkdb_open_noerr -env $menv -auto_commit \
-create -mode 0644} $largs $omethod $testfile]
error_check_good dbopen [is_valid_db $masterdb] TRUE
set envlist {}
lappend envlist "$menv 1"
for { set i 0 } { $i < $nclients } { incr i } {
lappend envlist "$clenv($i) $id($i)"
}
process_msgs $envlist
puts "\tRep$tnum.c: Running rep_test in primary replicated env."
eval rep_test $method $menv $masterdb $niter $e1phase1 1 1 0 $largs
eval rep_test $method $menv $masterdb $niter $e1phase2 1 1 0 $largs
eval rep_test $method $menv $masterdb $niter $e1phase3 1 1 0 $largs
error_check_good mdb_cl [$masterdb close] 0
process_msgs $envlist
puts "\tRep$tnum.d: Add unrelated client into replication group."
set i $nclients
set orig $nclients
set nclients [expr $nclients + 1]
set clientdir($i) $clientdir2
set id($i) [expr 2 + $i]
repladd $id($i)
set cl_envcmd($i) "berkdb_env_noerr -create -txn nosync \
-home $clientdir($i) $verbargs \
-rep_client -rep_transport \[list $id($i) replsend\]"
set clenv($i) [eval $cl_envcmd($i) $recargs]
$clenv($i) rep_config {noautoinit on}
lappend envlist "$clenv($i) $id($i)"
fileremove -f $clientdir2/prlog.orig
set stat [catch {eval exec $util_path/db_printlog \
-h $clientdir2 >> $clientdir2/prlog.orig} result]
set err 0
process_msgs $envlist 0 NONE err
puts "\tRep$tnum.e: Close all envs and run recovery in clients."
error_check_good menv_cl [$menv close] 0
for {set i 0} {$i < $nclients} {incr i} {
error_check_good cl$i.close [$clenv($i) close] 0
set hargs($i) "-h $clientdir($i)"
}
set i [expr $nclients - 1]
fileremove -f $clientdir($i)/prlog
set stat [catch {eval exec $util_path/db_printlog \
-h $clientdir($i) >> $clientdir($i)/prlog} result]
if { $err != 0 } {
puts "\tRep$tnum.f: Verify client log matches original."
error_check_good log_cmp(orig,$i) \
[filecmp $clientdir($i)/prlog.orig $clientdir($i)/prlog] 0
puts "\tRep$tnum.g: Verify client error."
error_check_good errchk [is_substr $err \
"REP_JOIN_FAILURE"] 1
} else {
puts "\tRep$tnum.f: Verify client log doesn't match original."
error_check_good log_cmp(orig,$i) \
[filecmp $clientdir($i)/prlog.orig $clientdir($i)/prlog] 1
puts "\tRep$tnum.g: Verify new client log matches master."
set stat [catch {eval exec $util_path/db_printlog \
-h $masterdir >& $masterdir/prlog} result]
fileremove -f $clientdir($i)/prlog
set stat [catch {eval exec $util_path/db_printlog \
-h $clientdir($i) >> $clientdir($i)/prlog} result]
error_check_good stat_prlog $stat 0
error_check_good log_cmp(master,$i) \
[filecmp $masterdir/prlog $clientdir($i)/prlog] 0
}
replclose $testdir/MSGQUEUEDIR
set testdir $orig_tdir
return
}