rpm/db/test/rep059.tcl

114 lines
3.0 KiB
Tcl

# See the file LICENSE for redistribution information.
#
# Copyright (c) 2005,2007 Oracle. All rights reserved.
#
# $Id: rep059.tcl,v 1.12 2007/05/17 18:17:21 bostic Exp $
#
# TEST rep059
# TEST
# TEST Replication with multiple recycle records.
# TEST
# TEST Mimic an application where a client has multiple recycle records
# TEST only in its log and then tries to synchronize. This has been
# TEST a problem because there is real log, but no perm records to
# TEST match on.
#
proc rep059 { method { tnum "059" } args } {
source ./include.tcl
global rep_verbose
set verbargs ""
if { $rep_verbose == 1 } {
set verbargs " -verbose {rep on} "
}
set orig_tdir $testdir
if { $is_windows9x_test == 1 } {
puts "Skipping replication test on Win 9x platform."
return
}
# There should be no difference with methods. Just use btree.
#
if { $checking_valid_methods } {
set test_methods { btree }
return $test_methods
}
if { [is_btree $method] == 0 } {
puts "Rep059: Skipping for method $method."
return
}
set largs [convert_args $method $args]
set masterdir $testdir/MASTERDIR
set clientdir $testdir/CLIENTDIR
set clientdir2 $testdir/CLIENTDIR2
env_cleanup $testdir
replsetup $testdir/MSGQUEUEDIR
file mkdir $masterdir
file mkdir $clientdir
file mkdir $clientdir2
set omethod [convert_method $method]
# Open a master.
repladd 1
set envcmd(M) "berkdb_env_noerr -create -txn nosync\
-lock_detect default -errpfx MASTER $verbargs \
-home $masterdir -rep_transport \[list 1 replsend\]"
set menv [eval $envcmd(M)]
# Open a client
repladd 2
set envcmd(C) "berkdb_env_noerr -create -txn nosync \
-lock_detect default -errpfx CLIENT1 $verbargs \
-home $clientdir -rep_transport \[list 2 replsend\]"
set cenv [eval $envcmd(C)]
# Open a 2nd client
repladd 3
set envcmd(C2) "berkdb_env_noerr -create -txn nosync \
-lock_detect default -errpfx CLIENT2 $verbargs \
-home $clientdir2 -rep_transport \[list 3 replsend\]"
set c2env [eval $envcmd(C2)]
#
# Set test location, then start as master and client
# This test hook will cause the master to return after
# writing the txn_recycle record in rep_start, but
# before writing the checkpoint, so that we have some
# log, but no perm records in the log when the new
# master takes over.
#
$menv test copy recycle
puts "\tRep$tnum.a: Start master and 2 clients."
error_check_good master [$menv rep_start -master] 0
error_check_good client [$cenv rep_start -client] 0
error_check_good client2 [$c2env rep_start -client] 0
set envlist "{$menv 1} {$cenv 2} {$c2env 3}"
process_msgs $envlist
# Pretend master crashes. Just close it and
# don't use it anymore.
error_check_good menv_close [$menv close] 0
puts "\tRep$tnum.b: Make client1 master."
set cenv [eval $envcmd(C) -rep_master]
set envlist "{$cenv 2} {$c2env 3}"
process_msgs $envlist
puts "\tRep$tnum.c: Clean up."
error_check_good cenv_close [$cenv close] 0
error_check_good c2env_close [$c2env close] 0
replclose $testdir/MSGQUEUEDIR
set testdir $orig_tdir
return
}