libdb/test/tcl/rep097script.tcl
2011-09-13 13:44:24 -04:00

152 lines
4.3 KiB
Tcl

# See the file LICENSE for redistribution information.
#
# Copyright (c) 2010, 2011 Oracle and/or its affiliates. All rights reserved.
#
# $Id$
#
# Rep097 script - Master leases.
#
# Test master leases and durability of operations.
#
# Usage: rep097script masterdir newmdir dbfile method
# masterdir: master env directory
# dbfile: name of database file
# method: access method
#
source ./include.tcl
source $test_path/test.tcl
source $test_path/testutils.tcl
source $test_path/reputils.tcl
set usage "repscript masterdir newmdir dbfile method"
# Verify usage
if { $argc != 4 } {
puts stderr "FAIL:[timestamp] Usage: $usage"
exit
}
# Initialize arguments
set masterdir [ lindex $argv 0 ]
set newmdir [ lindex $argv 1 ]
set dbfile [ lindex $argv 2 ]
set method [ lindex $argv 3 ]
# Join the queue env. We assume the rep test convention of
# placing the messages in $testdir/MSGQUEUEDIR.
set queueenv [eval berkdb_env -home $testdir/MSGQUEUEDIR]
error_check_good script_qenv_open [is_valid_env $queueenv] TRUE
#
# We need to set up our own machids.
# Add 2 for master env id, and 3 and 4 for the clientenv ids.
#
repladd 2
repladd 3
repladd 4
# Join the master env.
set ma_cmd "berkdb_env_noerr -home $masterdir \
-txn -rep_transport \[list 2 replsend\]"
set newma_cmd "berkdb_env_noerr -home $newmdir \
-txn -rep_transport \[list 3 replsend\]"
# set ma_cmd "berkdb_env_noerr -home $masterdir \
# -verbose {rep on} -errfile /dev/stderr \
# -txn -rep_transport \[list 2 replsend\]"
# set newma_cmd "berkdb_env_noerr -home $newmdir \
# -verbose {rep on} -errfile /dev/stderr \
# -txn -rep_transport \[list 3 replsend\]"
puts "Joining master env"
set masterenv [eval $ma_cmd]
error_check_good script_menv_open [is_valid_env $masterenv] TRUE
# Create a marker file. Don't put anything in it yet. The parent
# process will be processing messages while it looks for our
# marker.
puts "Create marker file"
set markerenv [berkdb_env -create -home $testdir -txn]
error_check_good markerenv_open [is_valid_env $markerenv] TRUE
set marker \
[eval "berkdb_open -create -btree -auto_commit -env $markerenv marker.db"]
#
# Create the database and then do a lease operation. Don't
# process messages in the child process.
#
puts "Open database"
set args [convert_args $method]
puts "args is $args"
set omethod [convert_method $method]
set open_args "-auto_commit -create $omethod $args $dbfile"
set db [eval "berkdb_open -env $masterenv $open_args"]
error_check_good script_db_open [is_valid_db $db] TRUE
puts "Do lease op"
set key 1
do_leaseop $masterenv $db $method $key NULL 0
$db close
$masterenv close
puts "Put CHILD1"
error_check_good child_key \
[$marker put CHILD1 $key] 0
puts "Wait for PARENT1"
# Give the parent a chance to process messages and check leases.
while { [llength [$marker get PARENT1]] == 0 } {
tclsleep 1
}
#
# At this point the master has crashed and the new master elected.
# Open a few copies of the db on the new master. We want several
# db handles to be open so that when the env runs recovery it will
# generate several RCLOSE log records and push the LSN out past
# the remaining sites (that write a txn to the log).
#
set newmenv [eval $newma_cmd]
error_check_good script_newenv_open [is_valid_env $newmenv] TRUE
set num_dbs 10
for { set i 0 } { $i < $num_dbs } { incr i } {
set ndb($i) [eval "berkdb_open -env $newmenv $open_args"]
error_check_good script_db_open [is_valid_db $ndb($i)] TRUE
}
puts "Do lease op 2"
incr key
do_leaseop $newmenv $ndb(0) $method $key NULL 0
puts "Put CHILD2"
error_check_good child2_key \
[$marker put CHILD2 $key] 0
puts "Wait for PARENT2"
# Give the parent a chance to process messages and check leases.
while { [llength [$marker get PARENT2]] == 0 } {
tclsleep 1
}
#
# After we get PARENT2, write one more txn.
#
incr key
do_leaseop $newmenv $ndb(0) $method $key NULL 0
puts "Put CHILD3"
error_check_good child2_key \
[$marker put CHILD3 $key] 0
puts "Wait for PARENT3"
# Give the parent a chance to process messages and check leases.
while { [llength [$marker get PARENT3]] == 0 } {
tclsleep 1
}
puts "Clean up and exit"
# Clean up the child so the parent can go forward.
for { set i 0 } { $i < $num_dbs } { incr i } {
error_check_good newm_db_close [$ndb($i) close] 0
}
error_check_good newm_close [$newmenv close] 0
error_check_good marker_db_close [$marker close] 0
error_check_good markerenv_close [$markerenv close] 0