libdb/test/tcl/rep078script.tcl
2012-11-14 15:13:24 -05:00

134 lines
3.5 KiB
Tcl

# See the file LICENSE for redistribution information.
#
# Copyright (c) 2003, 2012 Oracle and/or its affiliates. All rights reserved.
#
# $Id$
#
# Rep078 script - Master leases.
#
# Test master leases and write operations.
#
# Usage: rep078script masterdir 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 dbfile method"
# Verify usage
if { $argc != 3 } {
puts stderr "FAIL:[timestamp] Usage: $usage"
exit
}
# Initialize arguments
set masterdir [ lindex $argv 0 ]
set dbfile [ lindex $argv 1 ]
set method [ lindex $argv 2 ]
# 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 ma_cmd "berkdb_env_noerr -home $masterdir \
# -verbose {rep on} -errfile /dev/stderr \
# -txn -rep_transport \[list 2 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 db [eval "berkdb_open -env $masterenv -auto_commit -create \
$omethod $args $dbfile"]
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
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
}
puts "Do lease op 2"
incr key
do_leaseop $masterenv $db $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, do a checkpoint.
#
puts "Write a checkpoint"
$masterenv txn_checkpoint
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 "Write another checkpoint"
$masterenv txn_checkpoint -force
puts "Put CHILD4"
error_check_good child4_key \
[$marker put CHILD4 $key] 0
puts "Clean up and exit"
# Clean up the child so the parent can go forward.
error_check_good master_db_close [$db close] 0
error_check_good marker_db_close [$marker close] 0
error_check_good markerenv_close [$markerenv close] 0
error_check_good script_master_close [$masterenv close] 0