# 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