proc rep010 { method { niter 100 } { tnum "010" } args } {
source ./include.tcl
global perm_sent_list
global perm_rec_list
global rand_init
berkdb srand $rand_init
puts "Rep$tnum: Replication and ISPERM ($method)"
env_cleanup $testdir
set args [convert_args $method $args]
set omethod [convert_method $method]
replsetup $testdir/MSGQUEUEDIR
set masterdir $testdir/MASTERDIR
set clientdir $testdir/CLIENTDIR
file mkdir $masterdir
file mkdir $clientdir
repladd 1
set env_cmd(M) "berkdb_env_noerr -create -lock_max 2500 \
-log_max 1000000 \
-home $masterdir -txn nosync -rep_master \
-rep_transport \[list 1 replsend\]"
set masterenv [eval $env_cmd(M)]
error_check_good master_env [is_valid_env $masterenv] TRUE
repladd 2
set env_cmd(C) "berkdb_env_noerr -create -home $clientdir \
-txn nosync -rep_client \
-rep_transport \[list 2 replsend\]"
set clientenv [eval $env_cmd(C)]
error_check_good client_env [is_valid_env $clientenv] TRUE
rep010_procmessages $masterenv $clientenv
set dbname rep010.db
set db1 [eval "berkdb_open -create $omethod -auto_commit \
-env $masterenv $args $dbname"]
rep010_procmessages $masterenv $clientenv
puts "\tRep$tnum.a: Process messages with no gaps."
set perm_sent_list {}
set perm_rec_list {}
for { set i 1 } { $i <= $niter } { incr i } {
set t [$masterenv txn]
error_check_good db_put \
[eval $db1 put -txn $t $i [chop_data $method data$i]] 0
error_check_good txn_commit [$t commit] 0
rep010_procmessages $masterenv $clientenv
}
for { set i 1 } { $i <= $niter } { incr i } {
set t [$masterenv txn]
set ret \
[$db1 get -get_both -txn $t $i [pad_data $method data$i]]
error_check_good db_put \
[$db1 put -txn $t $i [chop_data $method newdata$i]] 0
error_check_good txn_commit [$t commit] 0
rep010_procmessages $masterenv $clientenv
}
for { set i 1 } { $i <= $niter } { incr i } {
set t [$masterenv txn]
error_check_good db_put [$db1 put -txn $t $i abort$i] 0
error_check_good txn_abort [$t abort] 0
rep010_procmessages $masterenv $clientenv
}
puts "\tRep$tnum.b: Process messages with gaps."
set perm_sent_list {}
set perm_rec_list {}
for { set i 1 } { $i <= $niter } { incr i } {
set t [$masterenv txn]
error_check_good db_put [$db1 put -txn $t $i data$i] 0
error_check_good txn_commit [$t commit] 0
}
set skip [berkdb random_int 2 8]
rep010_procmessages $masterenv $clientenv $skip
error_check_good db1_close [$db1 close] 0
error_check_good masterenv_close [$masterenv close] 0
error_check_good clientenv_close [$clientenv close] 0
replclose $testdir/MSGQUEUEDIR
}
proc rep010_procmessages { masterenv clientenv {skip_interval 0} } {
global perm_response
global perm_sent_list
global perm_rec_list
while { 1 } {
set nproced 0
incr nproced [replprocessqueue $masterenv 1 $skip_interval]
incr nproced [replprocessqueue $clientenv 2 $skip_interval]
set lsnlist {}
set logc [$clientenv log_cursor]
error_check_good logc \
[is_valid_logc $logc $clientenv] TRUE
for { set logrec [$logc get -first] } { [llength $logrec] != 0 } \
{ set logrec [$logc get -next] } {
lappend lsnlist [lindex [lindex $logrec 0] 1]
}
set lastloglsn [lindex $lsnlist end]
set permtype [lindex $perm_response 0]
set messagelsn [lindex [lindex $perm_response 1] 1]
if { $perm_response != "" } {
if { $permtype == "NOTPERM" } {
error_check_good \
notpermlsn [expr $messagelsn > $lastloglsn] 1
} elseif { $permtype == "ISPERM" } {
error_check_bad \
ispermlsn [lsearch $lsnlist $messagelsn] -1
} else {
puts "FAIL: unexpected message type $permtype"
}
}
error_check_good logc_close [$logc close] 0
if { $nproced == 0 } {
set last_sent [string index $perm_sent_list end]
set last_received [string index $perm_rec_list end]
error_check_good last_message $last_sent $last_received
break
}
}
}