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