proc rep065 { method { nsites 3 } args } {
source ./include.tcl
global noenv_messaging
set noenv_messaging 1
if { $is_windows9x_test == 1 } {
puts "Skipping replication test on Win 9x platform."
return
}
if { $checking_valid_methods } {
set test_methods { btree }
return $test_methods
}
if { [is_btree $method] == 0 } {
puts "Rep065: Skipping for method $method."
return
}
set mvlist [method_version]
set mvlen [llength $mvlist]
puts "Rep065: Testing the following $mvlen method/version pairs:"
puts "Rep065: $mvlist"
set count 1
set total [llength $mvlist]
set slist [setup_sites $nsites]
foreach i $mvlist {
puts "Rep065: Test iteration $count of $total: $i"
rep065_sub $count $i $nsites $slist
incr count
}
set noenv_messaging 0
}
proc rep065_sub { iter mv nsites slist } {
source ./include.tcl
global machids
global util_path
set machids {}
set method [lindex $mv 0]
set vers [lindex $mv 1]
puts "\tRep065.$iter.a: Set up."
set controldir [pwd]
env_cleanup $controldir/$testdir
replsetup_noenv $controldir/$testdir/MSGQUEUEDIR
set pwd [pwd]
set homedir [file dirname [file dirname $pwd]]
set reputils_path $pwd/../test
set histdir $homedir/$vers/build_unix
if { [file exists $histdir] == 0 } {
puts -nonewline "Skipping iteration $iter: cannot find"
puts " historical version $vers."
return
}
if { [file exists $histdir/db_verify] == 0 } {
puts -nonewline "Skipping iteration $iter: historical version"
puts " $vers is missing some executables. Is it built?"
return
}
set histtestdir $histdir/TESTDIR
env_cleanup $histtestdir
set markerdir $controldir/$testdir/MARKER
file delete -force $markerdir
set allids { }
for { set i 0 } { $i < $nsites } { incr i } {
set siteid($i) [expr $i + 1]
set sid $siteid($i)
lappend allids $sid
set histdirs($sid) $histtestdir/SITE.$i
set upgdir($sid) $controldir/$testdir/SITE.$i
file mkdir $histdirs($sid)
file mkdir $upgdir($sid)
}
set count 1
foreach sitevers $slist {
puts "\tRep065.b.$iter.$count: Run with sitelist $sitevers."
file delete -force $markerdir
file mkdir $markerdir
set mindex [get_master $nsites $sitevers]
set meid [expr $mindex + 1]
set pids {}
for { set i 0 } { $i < $nsites } { incr i } {
set upg [lindex $sitevers $i]
set sid $siteid($i)
if { $upg == 0 } {
puts -nonewline "\t\tRep065.b: Test: Old site $i"
set sitedir($i) $histdirs($sid)
set already_upgraded($i) 0
} else {
puts -nonewline "\t\tRep065.b: Test: Upgraded site $i"
set sitedir($i) $upgdir($sid)
if { $already_upgraded($i) == 0 } {
upg_repdir $histdirs($sid) $sitedir($i)
}
set already_upgraded($i) 1
}
if { $sid == $meid } {
set state MASTER
set runtest [list REPTEST $method 15 10]
puts " (MASTER)"
} else {
set state CLIENT
set runtest {REPTEST_GET}
puts " (CLIENT)"
}
lappend pids [exec $tclsh_path $test_path/wrap.tcl \
rep065script.tcl \
$controldir/$testdir/$count.S$i.log \
SKIP \
START $state \
$runtest \
$sid $allids $controldir \
$sitedir($i) $reputils_path &]
lappend pids [exec $tclsh_path $test_path/wrap.tcl \
rep065script.tcl \
$controldir/$testdir/$count.S$i.msg \
SKIP \
PROCMSGS $state \
NULL \
$sid $allids $controldir \
$sitedir($i) $reputils_path &]
}
watch_procs $pids 20
for { set i 0 } { $i < $nsites } { incr i } {
replclear_noenv $siteid($i)
}
set pids {}
puts "\tRep065.c.$iter.$count: Verify all sites."
for { set i 0 } { $i < $nsites } { incr i } {
if { $siteid($i) == $meid } {
set state MASTER
} else {
set state CLIENT
}
lappend pids [exec $tclsh_path $test_path/wrap.tcl \
rep065script.tcl \
$controldir/$testdir/$count.S$i.ver \
SKIP \
VERIFY $state \
{LOG DB} \
$siteid($i) $allids $controldir \
$sitedir($i) $reputils_path &]
}
watch_procs $pids 10
for { set i 0 } { $i < $nsites } { incr i } {
if { $i == $mindex } {
continue
}
puts \
"\t\tRep065.c: Verify: Compare databases master and client $i"
error_check_good db_cmp \
[filecmp $sitedir($mindex)/VERIFY/dbdump \
$sitedir($i)/VERIFY/dbdump] 0
set upg [lindex $sitevers $i]
if { $upg == 0 } {
puts \
"\t\tRep065.c: Verify: Compare logs master and client $i"
error_check_good log_cmp \
[filecmp $sitedir($mindex)/VERIFY/prlog \
$sitedir($i)/VERIFY/prlog] 0
} else {
puts \
"\t\tRep065.c: Verify: Compare LSNs master and client $i"
error_check_good log_cmp \
[filecmp $sitedir($mindex)/VERIFY/loglsn \
$sitedir($i)/VERIFY/loglsn] 0
}
}
incr count
}
}
proc setup_sites { nsites } {
set sitelist {}
for { set i 0 } { $i <= $nsites } { incr i } {
set l ""
for { set j 1 } { $j <= $nsites } { incr j } {
if { $i < $j } {
lappend l 0
} else {
lappend l 1
}
}
lappend sitelist $l
}
return $sitelist
}
proc upg_repdir { histdir upgdir } {
global util_path
file delete -force $upgdir
file copy -force $histdir $upgdir
set dbfiles [glob -nocomplain $upgdir/__db*]
foreach d $dbfiles {
if { $d == "$upgdir/__db.rep.gen" ||
$d == "$upgdir/__db.rep.egen" } {
continue
}
file delete -force $d
}
set stat [catch {eval exec $util_path/db_checkpoint -1 -h $upgdir} r]
if { $stat != 0 } {
puts "CHECKPOINT: $upgdir: $r"
}
error_check_good stat_ckp $stat 0
}
proc get_master { nsites verslist } {
error_check_good vlist_chk [llength $verslist] $nsites
set old_count 0
foreach i $verslist {
if { $i == 0 } {
incr old_count
}
}
if { $old_count == 0 } {
set old_count $nsites
}
set master [berkdb random_int 0 [expr $old_count - 1]]
if { $old_count == $nsites } {
return $master
}
set ocount 0
set index 0
foreach i $verslist {
if { $i == 1 } {
incr index
continue
}
if { $ocount == $master } {
return $index
}
incr ocount
incr index
}
error "FAIL: get_master problem"
}
proc method_version { } {
global valid_methods
set meth $valid_methods
set startmv { {btree db-4.4.20} {hash db-4.5.20} }
set midx [lsearch -exact $meth hash]
set meth [lreplace $meth $midx $midx]
set midx [lsearch -exact $meth btree]
set meth [lreplace $meth $midx $midx]
set vers {db-4.4.20 db-4.5.20 db-4.6.21}
set dbvlen [llength $vers]
set vers_list { 0 0 1 1 2 2 2 }
set vers_len [expr [llength $vers_list] - 1]
while { 1 } {
set mv $startmv
set vtest(0) 1
set vtest(1) 1
set vtest(2) 0
foreach m $meth {
set vidx [berkdb random_int 0 $vers_len]
set vindex [lindex $vers_list $vidx]
set vtest($vindex) 1
set v [lindex $vers $vindex]
lappend mv [list $m $v]
}
set all_vers 1
for { set i 0 } { $i < $dbvlen } { incr i } {
if { $vtest($i) == 0 } {
set all_vers 0
}
}
if { $all_vers == 1 } {
break
}
}
return $mv
}