1# See the file LICENSE for redistribution information. 2# 3# Copyright (c) 2004,2008 Oracle. All rights reserved. 4# 5# $Id: rep036script.tcl,v 12.10 2008/01/08 20:58:53 bostic Exp $ 6# 7# Rep036 script - create additional writers in master env. 8# 9# Usage: masterdir writerid 10# masterdir: Directory of replication master 11# writerid: i.d. number for writer 12source ./include.tcl 13source $test_path/test.tcl 14source $test_path/testutils.tcl 15source $test_path/reputils.tcl 16 17global rand_init 18set usage "repscript masterdir writerid nentries method" 19 20# Verify usage 21if { $argc != 4 } { 22 puts stderr "FAIL:[timestamp] Usage: $usage" 23 exit 24} 25 26# Initialize arguments 27set masterdir [ lindex $argv 0 ] 28set writerid [ lindex $argv 1 ] 29set nentries [ lindex $argv 2 ] 30set method [ lindex $argv 3 ] 31 32# Join the queue env. We assume the rep test convention of 33# placing the messages in $testdir/MSGQUEUEDIR. 34set queueenv [eval berkdb_env -home $testdir/MSGQUEUEDIR] 35error_check_good script_qenv_open [is_valid_env $queueenv] TRUE 36 37# We need to set up our own machid. 38repladd 1 39repladd 2 40 41# Start up deadlock detector. 42# Commented out - see #15049. 43#set dpid [eval {exec $util_path/db_deadlock} \ 44# -a o -v -t 2.0 -h $masterdir >& $testdir/dd.writer.$writerid.out &] 45 46# Join the master env. 47set envid 1 48set env_cmd "berkdb_env_noerr -home $masterdir \ 49 -errfile /dev/stderr -errpfx WRITER.$writerid \ 50 -txn -rep_master -rep_transport \[list $envid replsend\]" 51# set env_cmd "berkdb_env_noerr -home $masterdir \ 52# -errfile /dev/stderr -errpfx WRITER.$writerid \ 53# -verbose {rep on} \ 54# -txn -rep_master -rep_transport \[list $envid replsend\]" 55set masterenv [eval $env_cmd] 56error_check_good script_env_open [is_valid_env $masterenv] TRUE 57 58# Open database. 59set testfile "rep036.db" 60set omethod [convert_method $method] 61set mdb [eval {berkdb_open_noerr} -env $masterenv -auto_commit \ 62 -create $omethod $testfile] 63error_check_good dbopen [is_valid_db $mdb] TRUE 64 65# Write records to the database. 66set did [open $dict] 67set count 0 68set dictsize 10000 69berkdb srand $rand_init 70while { $count < $nentries } { 71 # 72 # If nentries exceeds the dictionary size, close 73 # and reopen to start from the beginning again. 74 if { [expr [expr $count + 1] % $dictsize] == 0 } { 75 close $did 76 set did [open $dict] 77 } 78 79 gets $did str 80 set key WRITER.$writerid.$str 81 set str [reverse $str] 82 83 set t [$masterenv txn] 84 error_check_good txn [is_valid_txn $t $masterenv] TRUE 85 set txn "-txn $t" 86 87# If using deadlock detection, uncomment this and comment the 88# following put statement. 89# # Writing to this database can deadlock. If we do, let the 90# # deadlock detector break the lock, wait a second, and try again. 91# while { [catch {eval {$mdb put}\ 92# $txn {$key [chop_data $method $str]}} ret] } { 93# error_check_good deadlock [is_substr $ret DB_LOCK_DEADLOCK] 1 94# tclsleep 1 95# } 96 97 set ret [eval \ 98 {$mdb put} $txn {$key [chop_data $method $str]}] 99 error_check_good put $ret 0 100 error_check_good txn [$t commit] 0 101 102 if { [expr $count % 100] == 1 } { 103 puts "Wrote WRITER.$writerid record $count" 104 set sleep [berkdb random_int 0 10] 105 puts "Writer.$writerid sleeping $sleep seconds" 106 tclsleep $sleep 107 } 108 incr count 109} 110close $did 111 112# Clean up. 113# Uncomment following line if using deadlock detector. 114#error_check_good kill_deadlock_detector [tclkill $dpid] "" 115error_check_good mdb_close [$mdb close] 0 116error_check_good masterenv_close [$masterenv close] 0 117replclose $testdir/MSGQUEUEDIR 118 119# Communicate with parent by creating a marker file. 120set markerenv [berkdb_env -create -home $testdir -txn] 121error_check_good markerenv_open [is_valid_env $markerenv] TRUE 122set marker [eval "berkdb_open \ 123 -create -btree -auto_commit -env $markerenv $writerid.db"] 124error_check_good marker_close [$marker close] 0 125error_check_good markerenv_close [$markerenv close] 0 126