File: repmgr002.tcl

package info (click to toggle)
db5.3 5.3.28%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 158,500 kB
  • sloc: ansic: 448,411; java: 111,824; tcl: 80,544; sh: 44,264; cs: 33,697; cpp: 21,604; perl: 14,557; xml: 10,799; makefile: 4,077; javascript: 1,998; yacc: 1,003; awk: 965; sql: 801; erlang: 342; python: 216; php: 24; asm: 14
file content (234 lines) | stat: -rw-r--r-- 7,328 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
#
# See the file LICENSE for redistribution information.
#
# Copyright (c) 2010, 2013 Oracle and/or its affiliates.  All rights reserved.
#
# $Id$
#
# TEST	repmgr002
# TEST	Basic repmgr test.
# TEST
# TEST	Run all combinations of the basic_repmgr_election_test.
# TEST
proc repmgr002 { {display 0} {run 1} args } {

	source ./include.tcl
	if { !$display && $is_freebsd_test == 1 } {
		puts "Skipping replication manager tests on FreeBSD platform."
		return
	}

	run_repmgr_tests election
}
#
# This is the basis for simple repmgr election test cases.  It opens three
# clients of different priorities and makes sure repmgr elects the
# expected master.  Then it shuts the master down and makes sure repmgr
# elects the expected remaining client master.  Then it makes sure the former
# master can join as a client.  The following parameters control 
# runtime options:
#     niter    - number of records to process
#     inmemdb  - put databases in-memory (0, 1)
#     inmemlog - put logs in-memory (0, 1)
#     inmemrep - put replication files in-memory (0, 1)
#     envprivate - put region files in-memory (0, 1)
#     bulk     - use bulk processing (0, 1)
#
proc basic_repmgr_election_test { niter inmemdb \
    inmemlog inmemrep envprivate bulk args } {

	source ./include.tcl
	global rep_verbose
	global verbose_type
	global overflowword1
	global overflowword2
	global databases_in_memory
	set overflowword1 "0"
	set overflowword2 "0"
	set nsites 3

	if { $is_freebsd_test == 1 } {
		puts "Skipping replication manager test on FreeBSD platform."
		return 
	}

	set method "btree"
	set largs [convert_args $method $args]

	if { $inmemdb } {
		set restore_dbinmem $databases_in_memory
		set databases_in_memory 1
	}

	set verbargs ""
	if { $rep_verbose == 1 } {
		set verbargs " -verbose {$verbose_type on} "
	}

	env_cleanup $testdir
	set ports [available_ports $nsites]

	set clientdir $testdir/CLIENTDIR
	set clientdir2 $testdir/CLIENTDIR2
	set clientdir3 $testdir/CLIENTDIR3

	file mkdir $clientdir
	file mkdir $clientdir2
	file mkdir $clientdir3

	# In-memory logs require a large log buffer, and cannot
	# be used with -txn nosync.  Adjust the args.
	set logtype "on-disk"
	if { $inmemlog } {
		set logtype "in-memory"
	}
	set logargs [adjust_logargs $logtype]
	set txnargs [adjust_txnargs $logtype]

	# Determine in-memory replication argument for environments.  Group
	# Membership needs the "legacy" workaround for in-memory replication
	# files.
	# 
	set repmemarg ""
	set creator_flag "creator"
	set legacy_flag ""
	if { $inmemrep } {
		set repmemarg " -rep_inmem_files "
		set creator_flag ""
		set legacy_flag "legacy"
	}

	# Determine argument for region files, on disk or in-mem.
	set private ""
	if { $envprivate } {
		set private " -private "
	}

	print_repmgr_headers basic_repmgr_election_test $niter $inmemdb\
	    $inmemlog $inmemrep $envprivate $bulk

	puts "\tBasic repmgr election test.a: Start three clients."

	# Open first client
	set cl_envcmd "berkdb_env_noerr -create \
	    $txnargs $verbargs $logargs $private \
	    -errpfx CLIENT -home $clientdir -rep -thread $repmemarg"
	set clientenv [eval $cl_envcmd]
	set cl1_repmgr_conf "-ack all -pri 100 \
	    -local { 127.0.0.1 [lindex $ports 0] \
		$creator_flag $legacy_flag } \
	    -remote { 127.0.0.1 [lindex $ports 1] $legacy_flag } \
	    -remote { 127.0.0.1 [lindex $ports 2] $legacy_flag } \
	    -start elect"
	eval $clientenv repmgr $cl1_repmgr_conf

	# Open second client
	set cl2_envcmd "berkdb_env_noerr -create \
	    $txnargs $verbargs $logargs $private \
	    -errpfx CLIENT2 -home $clientdir2 -rep -thread $repmemarg"
	set clientenv2 [eval $cl2_envcmd]
	set cl2_repmgr_conf "-ack all -pri 30 \
	    -local { 127.0.0.1 [lindex $ports 1] $legacy_flag } \
	    -remote { 127.0.0.1 [lindex $ports 0] $legacy_flag } \
	    -remote { 127.0.0.1 [lindex $ports 2] $legacy_flag } \
	    -start elect"
	eval $clientenv2 repmgr $cl2_repmgr_conf

	puts "\tBasic repmgr election test.b: Elect first client master."
	await_expected_master $clientenv
	set masterenv $clientenv
	set masterdir $clientdir
	await_startup_done $clientenv2

	# Open third client
	set cl3_envcmd "berkdb_env_noerr -create \
	    $txnargs $verbargs $logargs $private \
	    -errpfx CLIENT3 -home $clientdir3 -rep -thread $repmemarg"
	set clientenv3 [eval $cl3_envcmd]
	set cl3_repmgr_conf "-ack all -pri 20 \
	    -local { 127.0.0.1 [lindex $ports 2] $legacy_flag } \
	    -remote { 127.0.0.1 [lindex $ports 0] $legacy_flag } \
	    -remote { 127.0.0.1 [lindex $ports 1] $legacy_flag } \
	    -start elect"
	eval $clientenv3 repmgr $cl3_repmgr_conf
	await_startup_done $clientenv3

	#
	# Use of -ack all guarantees replication complete before repmgr send
	# function returns and rep_test finishes.
	#
	puts "\tBasic repmgr election test.c: Run some transactions at master."
	if { $bulk } {
		# Turn on bulk processing on master.
		error_check_good set_bulk [$masterenv rep_config {bulk on}] 0

		eval rep_test_bulk $method $masterenv NULL $niter 0 0 0 $largs

		# Must turn off bulk because some configs (debug_rop/wop)
		# generate log records when verifying databases.
		error_check_good set_bulk [$masterenv rep_config {bulk off}] 0
	} else {
		eval rep_test $method $masterenv NULL $niter 0 0 0 $largs
	}

	puts "\tBasic repmgr election test.d: Verify client database contents."
	rep_verify $masterdir $masterenv $clientdir2 $clientenv2 1 1 1
	rep_verify $masterdir $masterenv $clientdir3 $clientenv3 1 1 1

	puts "\tBasic repmgr election test.e:\
	    Shut down master, elect second client master."
	error_check_good client_close [$clientenv close] 0
	await_expected_master $clientenv2
	set masterenv $clientenv2
	await_startup_done $clientenv3

	# Open -recover to clear env region, including startup_done value.
	# Skip for in-memory logs, since that doesn't work with -recover.
	if { !$inmemlog } {
		puts "\tBasic repmgr election test.f: \
		    Restart former master as client."
		set clientenv [eval $cl_envcmd -recover]
		eval $clientenv repmgr $cl1_repmgr_conf
		await_startup_done $clientenv

		puts "\tBasic repmgr election test.g: \
		    Run some transactions at new master."
		eval rep_test $method $masterenv NULL $niter $niter 0 0 $largs

		puts "\tBasic repmgr election test.h: \
		    Verify client database contents."
		set masterdir $clientdir2
		rep_verify $masterdir $masterenv $clientdir $clientenv 1 1 1
		rep_verify $masterdir $masterenv $clientdir3 $clientenv3 1 1 1
	}

	# For in-memory replication, verify replication files not there.
	if { $inmemrep } {
		puts "\tBasic repmgr election test.i: \
		    Verify no replication files on disk."
		no_rep_files_on_disk $clientdir
		no_rep_files_on_disk $clientdir2
		no_rep_files_on_disk $clientdir3
	}

	# For private environments, verify region files are not on disk.
	if { $envprivate } {
		puts "\tBasic repmgr election test.j: \
		    Verify no region files on disk."
		no_region_files_on_disk $clientdir
		no_region_files_on_disk $clientdir2
		no_region_files_on_disk $clientdir3
	}

	# Restore original databases_in_memory value. 
	if { $inmemdb } {
		set databases_in_memory $restore_dbinmem
	}

	if { !$inmemlog } {
		error_check_good client_close [$clientenv close] 0
	}
	error_check_good client3_close [$clientenv3 close] 0
	error_check_good client2_close [$clientenv2 close] 0
}