1# See the file LICENSE for redistribution information. 2# 3# Copyright (c) 2005,2008 Oracle. All rights reserved. 4# 5# $Id: rep043script.tcl,v 1.16 2008/01/08 20:58:53 bostic Exp $ 6# 7# Rep043 script - constant writes to an env which may be 8# either a master or a client, or changing between the 9# two states 10# 11# Usage: dir writerid 12# dir: Directory of writer 13# writerid: i.d. number for writer 14 15set usage "rep043script dir writerid" 16 17# Verify usage 18if { $argc != 2 } { 19 puts stderr "FAIL:[timestamp] Usage: $usage" 20 exit 21} 22 23# Initialize arguments 24set dir [ lindex $argv 0 ] 25set writerid [ lindex $argv 1 ] 26set nentries 50 27 28# Join the queue env. We assume the rep test convention of 29# placing the messages in $testdir/MSGQUEUEDIR. 30set queueenv [eval berkdb_env -home $testdir/MSGQUEUEDIR] 31error_check_good script_qenv_open [is_valid_env $queueenv] TRUE 32 33# We need to set up our own machids. 34set envid [expr $writerid + 1] 35repladd $envid 36set name "WRITER.$writerid" 37 38# Pause a bit to give the master a chance to create the database 39# before we try to join. 40tclsleep 3 41 42# Join the env. 43set env_cmd "berkdb_env_noerr -home $dir -lock_detect default \ 44 -errfile /dev/stderr -errpfx WRITER.$writerid \ 45 -txn -rep_transport \[list $envid replsend\]" 46# set env_cmd "berkdb_env_noerr -home $dir \ 47# -errfile /dev/stderr -errpfx WRITER.$writerid \ 48# -verbose {rep on} -lock_detect default \ 49# -txn -rep_transport \[list $envid replsend\]" 50set dbenv [eval $env_cmd] 51error_check_good script_env_open [is_valid_env $dbenv] TRUE 52 53# Open database. It's still possible under heavy load that the 54# master hasn't created the database, so pause even longer if it's 55# not there. 56set testfile "rep043.db" 57while {[catch {berkdb_open_noerr -errpfx $name -errfile /dev/stderr\ 58 -env $dbenv -auto_commit $testfile} db]} { 59 puts "Could not open handle $db, sleeping 1 second." 60 tclsleep 1 61} 62error_check_good dbopen [is_valid_db $db] TRUE 63 64# Communicate with parent in marker file. 65set markerenv [berkdb_env -home $testdir -txn] 66error_check_good markerenv_open [is_valid_env $markerenv] TRUE 67set marker [eval "berkdb_open \ 68 -create -btree -auto_commit -env $markerenv marker.db"] 69 70# Write records to the database. 71set iter INIT 72set olditer $iter 73while { [llength [$marker get DONE]] == 0 } { 74 for { set i 0 } { $i < $nentries } { incr i } { 75 set kd [$marker get ITER] 76 if { [llength $kd] == 0 } { 77 set iter X 78 } else { 79 set iter [lindex [lindex $kd 0] 1] 80 } 81 if { $iter != $olditer } { 82 puts "Entry $i: Iter changed from $olditer to $iter" 83 set olditer $iter 84 } 85 86 set key WRITER.$writerid.$iter.$i 87 set str string.$i 88 89 set t [$dbenv txn] 90 error_check_good txn [is_valid_txn $t $dbenv] TRUE 91 set stat [catch {$db put -txn $t $key $str} res] 92 if { $stat == 0 } { 93puts "res is $res, commit" 94 error_check_good txn_commit [$t commit] 0 95 } else { 96puts "res is $res, abort" 97 error_check_good txn_abort [$t abort] 0 98 } 99 100 # If the handle is dead, get a new one. 101 if { [is_substr $res DB_REP_HANDLE_DEAD] == 1 } { 102puts "Close - dead handle." 103 error_check_good db_close [$db close] 0 104puts "Getting new handle" 105 while {[catch {berkdb_open_noerr -env $dbenv\ 106 -auto_commit $testfile} db]} { 107 puts "Could not open handle: $db" 108 tclsleep 1 109 } 110 error_check_good db_open [is_valid_db $db] TRUE 111 } 112 113 if { [expr $i % 10] == 1 } { 114 puts "Wrote WRITER.$writerid.$iter.$i record $i" 115 } 116 } 117 tclsleep 1 118} 119 120# Clean up. 121error_check_good db_close [$db close] 0 122error_check_good dbenv_close [$dbenv close] 0 123replclose $testdir/MSGQUEUEDIR 124error_check_good marker_close [$marker close] 0 125error_check_good markerenv_close [$markerenv close] 0 126