Files
cpython-source-deps/test/rep078script.tcl
2017-09-04 13:40:25 -05:00

124 lines
3.3 KiB
Tcl

# See the file LICENSE for redistribution information.
#
# Copyright (c) 2003,2008 Oracle. All rights reserved.
#
# $Id: rep078script.tcl,v 12.3 2008/01/08 20:58:53 bostic Exp $
#
# 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.
# Then our work is done and we clean up.
#
puts "Write a checkpoint"
$masterenv txn_checkpoint
puts "Put CHILD3"
error_check_good child2_key \
[$marker put CHILD3 $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