proc rep034 { method { niter 2 } { tnum "034" } args } {
source ./include.tcl
if { $is_windows9x_test == 1 } {
puts "Skipping replication test on Win 9x platform."
return
}
if { $checking_valid_methods } {
return "ALL"
}
set args [convert_args $method $args]
set logsets [create_logsets 3]
foreach l $logsets {
puts "Rep$tnum ($method $args):\
Test of startup synchronization detection."
puts "Rep$tnum: Master logs are [lindex $l 0]"
puts "Rep$tnum: Client 0 logs are [lindex $l 1]"
puts "Rep$tnum: Client 1 logs are [lindex $l 2]"
rep034_sub $method $niter $tnum $l $args
}
}
proc rep034_sub { method niter tnum logset largs } {
global anywhere
global testdir
global startup_done
global rep_verbose
global rep034_got_allreq
set verbargs ""
if { $rep_verbose == 1 } {
set verbargs " -verbose {rep on} "
}
env_cleanup $testdir
replsetup $testdir/MSGQUEUEDIR
set masterdir $testdir/MASTERDIR
set clientdir $testdir/CLIENTDIR
set clientdir2 $testdir/CLIENTDIR2
file mkdir $masterdir
file mkdir $clientdir
file mkdir $clientdir2
set m_logtype [lindex $logset 0]
set c_logtype [lindex $logset 1]
set c2_logtype [lindex $logset 2]
set m_logargs [adjust_logargs $m_logtype]
set c_logargs [adjust_logargs $c_logtype]
set c2_logargs [adjust_logargs $c2_logtype]
set m_txnargs [adjust_txnargs $m_logtype]
set c_txnargs [adjust_txnargs $c_logtype]
set c2_txnargs [adjust_txnargs $c2_logtype]
set anywhere 0
repladd 1
set ma_envcmd "berkdb_env_noerr -create $m_txnargs $m_logargs \
-event rep_event $verbargs -errpfx MASTER \
-home $masterdir -rep_master -rep_transport \[list 1 replsend\]"
set masterenv [eval $ma_envcmd]
puts "\tRep$tnum.a: Create master; add some data."
eval rep_test $method $masterenv NULL $niter 0 0 0 0 $largs
puts "\tRep$tnum.b: Bring up client; check STARTUPDONE."
repladd 2
set cl_envcmd "berkdb_env_noerr -create $c_txnargs $c_logargs \
-event rep_event $verbargs -errpfx CLIENT \
-home $clientdir -rep_client -rep_transport \[list 2 replsend\]"
set clientenv [eval $cl_envcmd]
set envlist "{$masterenv 1} {$clientenv 2}"
set startup_done 0
process_msgs $envlist
error_check_good done_without_live_txns \
[stat_field $clientenv rep_stat "Startup complete"] 1
error_check_good done_event_too $startup_done 1
puts "\tRep$tnum.c: Another client; no STARTUPDONE at NEWMASTER LSN."
set newmaster_lsn [stat_field $masterenv rep_stat "Next LSN expected"]
repladd 3
set cl2_envcmd "berkdb_env_noerr -create $c2_txnargs $c2_logargs \
-event rep_event $verbargs -errpfx CLIENT2 \
-home $clientdir2 -rep_client -rep_transport \[list 3 rep034_send\]"
set client2env [eval $cl2_envcmd]
set envlist "{$masterenv 1} {$clientenv 2} {$client2env 3}"
set verified false
for {set i 0} {$i < 10} {incr i} {
proc_msgs_once $envlist
set client2lsn \
[stat_field $client2env rep_stat "Next LSN expected"]
if {[$client2env log_compare $client2lsn $newmaster_lsn] > 0} {
if {![stat_field \
$client2env rep_stat "Startup complete"]} {
set verified true
}
break;
}
eval rep_test $method $masterenv NULL $niter 0 0 0 0 $largs
}
error_check_good no_newmaster_trigger $verified true
process_msgs $envlist
error_check_good done_during_live_txns \
[stat_field $client2env rep_stat "Startup complete"] 1
set anywhere 1
if {$c_logtype eq "in-mem"} {
puts "\tRep$tnum.d: Skip rest of test for in-memory logging."
$masterenv close
$clientenv close
$client2env close
replclose $testdir/MSGQUEUEDIR
return
}
puts "\tRep$tnum.d: Verify STARTUPDONE using c2c sync."
$clientenv close
set clientenv [eval $cl_envcmd -recover]
set envlist "{$masterenv 1} {$clientenv 2} {$client2env 3}"
$client2env rep_stat -clear
process_msgs $envlist
error_check_good done_via_c2c \
[stat_field $clientenv rep_stat "Startup complete"] 1
error_check_bad c2c_served_by_master \
[stat_field $client2env rep_stat "Client service requests"] 0
if {$c2_logtype eq "in-mem"} {
puts "\tRep$tnum.e: Skip rest of test for in-memory logging."
$masterenv close
$clientenv close
$client2env close
replclose $testdir/MSGQUEUEDIR
return
}
puts "\tRep$tnum.e: Check no STARTUPDONE when c2c server is behind."
$clientenv close
$client2env close
set anywhere 0
set client2env [eval $cl2_envcmd -recover]
set envlist "{$masterenv 1} {$client2env 3}"
set rep034_got_allreq false
while { !$rep034_got_allreq } {
proc_msgs_once $envlist
}
error_check_good serve_from_notstarted \
[stat_field $client2env rep_stat "Startup complete"] 0
set anywhere 1
$client2env rep_stat -clear
replclear 2
set clientenv [eval $cl_envcmd -recover]
$clientenv rep_request 4 4
set envlist "{$masterenv 1} {$clientenv 2} {$client2env 3}"
while {[rep034_proc_msgs_once $masterenv $clientenv $client2env] > 0} {}
error_check_good not_from_undone_c2c_client \
[stat_field $clientenv rep_stat "Startup complete"] 0
error_check_bad c2c_served_by_master \
[stat_field $client2env rep_stat "Client service requests"] 0
puts "\tRep$tnum.f: Check STARTUPDONE via fall-back to live txns."
eval rep_test $method $masterenv NULL $niter 0 0 0 0 $largs
process_msgs $envlist
error_check_good fallback_live_txns \
[stat_field $clientenv rep_stat "Startup complete"] 1
$masterenv close
$clientenv close
$client2env close
replclose $testdir/MSGQUEUEDIR
set anywhere 0
}
proc rep034_proc_msgs_once { masterenv clientenv client2env } {
set nproced [proc_msgs_once "{$masterenv 1}" NONE err]
error_check_good pmonce_1 $err 0
replclear 3
incr nproced [proc_msgs_once "{$clientenv 2} {$client2env 3}" NONE err]
error_check_good pmonce_2 $err 0
return $nproced
}
proc rep034_send { control rec fromid toid flags lsn } {
global rep034_got_allreq
if {[berkdb msgtype $control] eq "all_req"} {
set rep034_got_allreq true
}
return [replsend $control $rec $fromid $toid $flags $lsn]
}