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