1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 2007,2008 Oracle.  All rights reserved.
4#
5# $Id: rep076.tcl,v 12.5 2008/01/08 20:58:53 bostic Exp $
6#
7# TEST	rep076
8# TEST	Replication elections - what happens if elected client
9# TEST  does not become master?
10# TEST
11# TEST	Set up a master and 3 clients.  Take down master, run election.
12# TEST	The elected client will ignore the fact that it's been elected,
13# TEST	so we still have 2 clients.
14# TEST
15# TEST	Run another election, a regular election that allows the winner
16# TEST	to become master, and make sure it goes okay.  We do this both
17# TEST	for the client that ignored its election and for the other client.
18# TEST
19# TEST	This simulates what would happen if, say, we had a temporary
20# TEST	network partition and lost the winner.
21#
22proc rep076 { method args } {
23	source ./include.tcl
24
25	global mixed_mode_logging
26	set tnum "076"
27	if { $is_windows9x_test == 1 } {
28		puts "Skipping replication test on Win 9x platform."
29		return
30	}
31
32	# Run for btree only.
33	if { $checking_valid_methods } {
34		set test_methods { btree }
35		return $test_methods
36	}
37	if { [is_btree $method] == 0 } {
38		puts "Rep$tnum: Skipping for method $method."
39		return
40	}
41
42	set nclients 3
43	set logsets [create_logsets [expr $nclients + 1]]
44	set winsets { { 1 1 } { 1 2 } }
45	foreach l $logsets {
46		foreach w $winsets {
47			puts "Rep$tnum ($method): Replication elections -\
48			    elected client ignores election."
49			puts "Rep$tnum: Master logs are [lindex $l 0]"
50			for { set i 0 } { $i < $nclients } { incr i } {
51				puts "Rep$tnum: Client $i logs are\
52				    [lindex $l [expr $i + 1]]"
53			}
54			rep076_sub $method $nclients $tnum $l $w $args
55		}
56	}
57}
58
59proc rep076_sub { method nclients tnum logset winset largs } {
60	source ./include.tcl
61	global machids
62	global rep_verbose
63	global verbose_type
64
65	set verbargs ""
66	if { $rep_verbose == 1 } {
67		set verbargs " -verbose {$verbose_type on} "
68	}
69
70	env_cleanup $testdir
71
72	set qdir $testdir/MSGQUEUEDIR
73	replsetup $qdir
74
75	set masterdir $testdir/MASTERDIR
76	file mkdir $masterdir
77	set m_logtype [lindex $logset 0]
78	set m_logargs [adjust_logargs $m_logtype]
79	set m_txnargs [adjust_txnargs $m_logtype]
80
81	for { set i 0 } { $i < $nclients } { incr i } {
82		set clientdir($i) $testdir/CLIENTDIR.$i
83		file mkdir $clientdir($i)
84		set c_logtype($i) [lindex $logset [expr $i + 1]]
85		set c_logargs($i) [adjust_logargs $c_logtype($i)]
86		set c_txnargs($i) [adjust_txnargs $c_logtype($i)]
87	}
88
89	# Open a master.
90	set envlist {}
91	repladd 1
92	set env_cmd(M) "berkdb_env -create -log_max 1000000 $verbargs \
93	    -event rep_event \
94	    -home $masterdir $m_txnargs $m_logargs -rep_master \
95	    -errpfx MASTER -rep_transport \[list 1 replsend\]"
96	set masterenv [eval $env_cmd(M)]
97	lappend envlist "$masterenv 1"
98
99	# Open the clients.
100	for { set i 0 } { $i < $nclients } { incr i } {
101		set envid [expr $i + 2]
102		repladd $envid
103		set env_cmd($i) "berkdb_env_noerr -create $verbargs \
104		    -event rep_event \
105		    -home $clientdir($i) $c_txnargs($i) $c_logargs($i) \
106		    -rep_client -rep_transport \[list $envid replsend\]"
107		set clientenv($i) [eval $env_cmd($i)]
108		error_check_good \
109		    client_env($i) [is_valid_env $clientenv($i)] TRUE
110		lappend envlist "$clientenv($i) $envid"
111	}
112
113	# Bring the clients online by processing the startup messages.
114	process_msgs $envlist
115
116	# Run a modified test001 in the master.
117	puts "\tRep$tnum.a: Running rep_test in replicated env."
118	set niter 10
119	eval rep_test $method $masterenv NULL $niter 0 0 0 0 $largs
120	process_msgs $envlist
121
122	# Close master.
123	error_check_good masterenv_close [$masterenv close] 0
124	set envlist [lreplace $envlist 0 0]
125
126	# Winner1 is set up to win the first election, winner2
127	# the second.
128	set m "Rep$tnum.b"
129	set winner1 [lindex $winset 0]
130	set winner2 [lindex $winset 1]
131	set elector 1
132	set nsites $nclients
133	set nvotes $nclients
134	setpriority pri $nclients $winner1
135	foreach pair $envlist {
136		set i [expr [lindex $pair 1] - 2]
137		replclear [expr $i + 2]
138		set err_cmd($i) "none"
139		set crash($i) 0
140		if { $rep_verbose == 1 } {
141			$clientenv($i) errpfx CLIENT$i
142			$clientenv($i) verbose $verbose_type on
143			$clientenv($i) errfile /dev/stderr
144			set env_cmd($i) [concat $env_cmd($i) \
145			    "-errpfx CLIENT$i -errfile /dev/stderr"]
146		}
147	}
148
149
150	# Run election where winner will ignore its election and
151	# not be made master.
152	puts "\tRep$tnum: First winner ignores its election."
153	run_election env_cmd envlist err_cmd pri crash $qdir $m\
154	    $elector $nsites $nvotes $nclients $winner1 0 test.db 1
155
156	# Run second election where winner accepts its election and
157	# is made master.
158	puts "\tRep$tnum: Second winner accepts its election."
159	setpriority pri $nclients $winner2
160	run_election env_cmd envlist err_cmd pri crash $qdir $m\
161	    $elector $nsites $nvotes $nclients $winner2 0 test.db
162
163	# Clean up.
164	foreach pair $envlist {
165		set cenv [lindex $pair 0]
166		error_check_good cenv_close [$cenv close] 0
167	}
168
169	replclose $testdir/MSGQUEUEDIR
170}
171
172