# 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

