1# See the file LICENSE for redistribution information.
2#
3# Copyright (c)-2009 Oracle.  All rights reserved.
4#
5# TEST repmgr028
6# TEST Simple smoke test for repmgr elections with multi-process envs.
7
8proc repmgr028 { } {
9	source ./include.tcl
10
11	set tnum "028"
12	puts "Repmgr$tnum:\
13	    Smoke test for repmgr elections with multi-process envs."
14
15	env_cleanup $testdir
16
17	set ports [available_ports 3]
18
19	set dbconfig {
20		{rep_set_nsites 3}
21		{rep_set_timeout DB_REP_ELECTION_RETRY 2000000}
22		{rep_set_timeout DB_REP_ELECTION_TIMEOUT 1000000}
23	}
24	foreach d {A B C} {
25		file mkdir $testdir/$d
26		make_dbconfig $testdir/$d $dbconfig
27	}
28
29	puts "\tRepmgr$tnum.a: Start 3 sites (with 2 processes each)."
30	set cmds {
31		{home $testdir/A}
32		{local [lindex $ports 0]}
33		{open_env}
34		{start election}
35	}
36	set cmds [subst $cmds]
37	set a1 [open_site_prog [linsert $cmds 1 "output $testdir/a1output"]]
38	set a2 [open_site_prog [linsert $cmds 1 "output $testdir/a2output"]]
39
40	set cmds {
41		{home $testdir/B}
42		{local [lindex $ports 1]}
43		{remote localhost [lindex $ports 0]}
44		{open_env}
45		{start election}
46	}
47	set cmds [subst $cmds]
48	set b1 [open_site_prog [linsert $cmds 1 "output $testdir/b1output"]]
49	set b2 [open_site_prog [linsert $cmds 1 "output $testdir/b2output"]]
50
51	set cmds {
52		{home $testdir/C}
53		{local [lindex $ports 2]}
54		{remote localhost [lindex $ports 0]}
55		{open_env}
56		{start election}
57	}
58	set cmds [subst $cmds]
59	set c1 [open_site_prog [linsert $cmds 1 "output $testdir/c1output"]]
60	set c2 [open_site_prog [linsert $cmds 1 "output $testdir/c2output"]]
61
62	puts "\tRepmgr$tnum.b: Wait for an election to choose initial master."
63	set a [berkdb_env -home $testdir/A]
64	set b [berkdb_env -home $testdir/B]
65	set c [berkdb_env -home $testdir/C]
66	set sites "$a $b $c"
67	set menv [repmgr028_await_election $sites]
68	set i [lsearch -exact $sites $menv]
69	error_check_bad notfound $i -1
70	set site_names "abc"
71	set m [string range $site_names $i $i]
72	puts "\tRepmgr$tnum.c: (site $m is master)."
73
74	puts "\tRepmgr$tnum.d: Wait for other two sites to sync up."
75	set clients [lreplace $sites $i $i]
76	set site_names [string replace $site_names $i $i]
77	await_startup_done [lindex $clients 0]
78	await_startup_done [lindex $clients 1]
79
80	set m1 [subst $${m}1]
81	set m2 [subst $${m}2]
82
83	puts $m2 "open_db test.db"
84	puts $m2 "put key1 value1"
85	puts $m2 "echo done"
86	gets $m2
87
88	puts "\tRepmgr$tnum.e:\
89	    Shut down master, wait for survivors to elect new master."
90	$menv close
91	close $m1
92	close $m2
93
94	set menv [repmgr028_await_election $clients]
95	set i [lsearch -exact $clients $menv]
96	error_check_bad notfound2 $i -1
97	set m [string range $site_names $i $i]
98	puts "\tRepmgr$tnum.f: (site $m is new master)."
99
100	puts "\tRepmgr$tnum.g: Wait for remaining client to sync to new master."
101	set client [lreplace $clients $i $i]
102	error_check_good master_changes \
103	    [stat_field $client rep_stat "Master changes"] 2
104	await_startup_done $client
105
106	puts "\tRepmgr$tnum.h: Clean up."
107	$client close
108	$menv close
109
110	set c [string range $site_names 0 0]
111	close [subst $${c}1]
112	close [subst $${c}2]
113	set c [string range $site_names 1 1]
114	close [subst $${c}1]
115	close [subst $${c}2]
116}
117
118proc repmgr028_await_election { env_list } {
119	set cond {
120		foreach e $env_list {
121			if {[stat_field $e rep_stat "Role"] == "master"} {
122				set answer $e
123				break
124			}
125		}
126		expr {[info exists answer]}
127	}
128	await_condition {[eval $cond]} 20
129	return $answer
130}
131