summaryrefslogtreecommitdiff
path: root/storage/bdb/test/rep001.tcl
blob: 97a640029f556532d66b44b4a35a241a455b7c5b (plain)
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
# See the file LICENSE for redistribution information.
#
# Copyright (c) 2001-2002
#	Sleepycat Software.  All rights reserved.
#
# $Id: rep001.tcl,v 1.16 2002/08/26 17:52:19 margo Exp $
#
# TEST  rep001
# TEST	Replication rename and forced-upgrade test.
# TEST
# TEST	Run a modified version of test001 in a replicated master environment;
# TEST  verify that the database on the client is correct.
# TEST	Next, remove the database, close the master, upgrade the 
# TEST	client, reopen the master, and make sure the new master can correctly
# TEST	run test001 and propagate it in the other direction.

proc rep001 { method { niter 1000 } { tnum "01" } args } {
	global passwd

	puts "Rep0$tnum: Replication sanity test."

	set envargs ""
	rep001_sub $method $niter $tnum $envargs $args

	puts "Rep0$tnum: Replication and security sanity test."
	append envargs " -encryptaes $passwd "
	append args " -encrypt "
	rep001_sub $method $niter $tnum $envargs $args
}

proc rep001_sub { method niter tnum envargs largs } {
	source ./include.tcl
	global testdir
	global encrypt

	env_cleanup $testdir

	replsetup $testdir/MSGQUEUEDIR

	set masterdir $testdir/MASTERDIR
	set clientdir $testdir/CLIENTDIR

	file mkdir $masterdir
	file mkdir $clientdir

	if { [is_record_based $method] == 1 } {
		set checkfunc test001_recno.check
	} else {
		set checkfunc test001.check
	}

	# Open a master.
	repladd 1
	set masterenv \
	    [eval {berkdb_env -create -lock_max 2500 -log_max 1000000} \
	    $envargs {-home $masterdir -txn -rep_master -rep_transport \
	    [list 1 replsend]}]
	error_check_good master_env [is_valid_env $masterenv] TRUE

	# Open a client
	repladd 2
	set clientenv [eval {berkdb_env -create} $envargs -txn -lock_max 2500 \
	    {-home $clientdir -rep_client -rep_transport [list 2 replsend]}]
	error_check_good client_env [is_valid_env $clientenv] TRUE

	# Bring the client online by processing the startup messages.
	set donenow 0
	while { 1 } {
		set nproced 0

		incr nproced [replprocessqueue $masterenv 1]
		incr nproced [replprocessqueue $clientenv 2]

		if { $nproced == 0 } {
			break
		}
	}

	# Open a test database on the master (so we can test having handles
	# open across an upgrade).
	puts "\tRep0$tnum.a:\
	    Opening test database for post-upgrade client logging test."
	set master_upg_db [berkdb_open \
	    -create -auto_commit -btree -env $masterenv rep0$tnum-upg.db]
	set puttxn [$masterenv txn]
	error_check_good master_upg_db_put \
	    [$master_upg_db put -txn $puttxn hello world] 0
	error_check_good puttxn_commit [$puttxn commit] 0
	error_check_good master_upg_db_close [$master_upg_db close] 0

	# Run a modified test001 in the master (and update client).
	puts "\tRep0$tnum.b: Running test001 in replicated env."
	eval test001 $method $niter 0 $tnum 1 -env $masterenv $largs
	set donenow 0
	while { 1 } {
		set nproced 0

		incr nproced [replprocessqueue $masterenv 1]
		incr nproced [replprocessqueue $clientenv 2]

		if { $nproced == 0 } {
			break
		}
	}

	# Open the cross-upgrade database on the client and check its contents.
	set client_upg_db [berkdb_open \
	     -create -auto_commit -btree -env $clientenv rep0$tnum-upg.db]
	error_check_good client_upg_db_get [$client_upg_db get hello] \
	     [list [list hello world]]
	# !!! We use this handle later.  Don't close it here.

	# Verify the database in the client dir.
	puts "\tRep0$tnum.c: Verifying client database contents."
	set testdir [get_home $masterenv]
	set t1 $testdir/t1
	set t2 $testdir/t2
	set t3 $testdir/t3
	open_and_dump_file test0$tnum.db $clientenv $t1 \
	    $checkfunc dump_file_direction "-first" "-next"

	# Remove the file (and update client).
	puts "\tRep0$tnum.d: Remove the file on the master and close master."
	error_check_good remove \
	    [$masterenv dbremove -auto_commit test0$tnum.db] 0
	error_check_good masterenv_close [$masterenv close] 0
	set donenow 0
	while { 1 } {
		set nproced 0

		incr nproced [replprocessqueue $masterenv 1]
		incr nproced [replprocessqueue $clientenv 2]

		if { $nproced == 0 } {
			break
		}
	}

	# Don't get confused in Tcl.
	puts "\tRep0$tnum.e: Upgrade client."
	set newmasterenv $clientenv
	error_check_good upgrade_client [$newmasterenv rep_start -master] 0

	# Run test001 in the new master
	puts "\tRep0$tnum.f: Running test001 in new master."
	eval test001 $method $niter 0 $tnum 1 -env $newmasterenv $largs
	set donenow 0
	while { 1 } {
		set nproced 0

		incr nproced [replprocessqueue $newmasterenv 2]

		if { $nproced == 0 } {
			break
		}
	}

	puts "\tRep0$tnum.g: Reopen old master as client and catch up."
	# Throttle master so it can't send everything at once
	$newmasterenv rep_limit 0 [expr 64 * 1024]
	set newclientenv [eval {berkdb_env -create -recover} $envargs \
	    -txn -lock_max 2500 \
	    {-home $masterdir -rep_client -rep_transport [list 1 replsend]}]
	error_check_good newclient_env [is_valid_env $newclientenv] TRUE
	set donenow 0
	while { 1 } {
		set nproced 0

		incr nproced [replprocessqueue $newclientenv 1]
		incr nproced [replprocessqueue $newmasterenv 2]

		if { $nproced == 0 } {
			break
		}
	}
	set stats [$newmasterenv rep_stat]
	set nthrottles [getstats $stats {Transmission limited}]
	error_check_bad nthrottles $nthrottles -1
	error_check_bad nthrottles $nthrottles 0

	# Run a modified test001 in the new master (and update client).
	puts "\tRep0$tnum.h: Running test001 in new master."
	eval test001 $method \
	    $niter $niter $tnum 1 -env $newmasterenv $largs
	set donenow 0
	while { 1 } {
		set nproced 0

		incr nproced [replprocessqueue $newclientenv 1]
		incr nproced [replprocessqueue $newmasterenv 2]

		if { $nproced == 0 } {
			break
		}
	}

	# Test put to the database handle we opened back when the new master
	# was a client.
	puts "\tRep0$tnum.i: Test put to handle opened before upgrade."
	set puttxn [$newmasterenv txn]
	error_check_good client_upg_db_put \
	    [$client_upg_db put -txn $puttxn hello there] 0
	error_check_good puttxn_commit [$puttxn commit] 0
	set donenow 0
	while { 1 } {
		set nproced 0

		incr nproced [replprocessqueue $newclientenv 1]
		incr nproced [replprocessqueue $newmasterenv 2]

		if { $nproced == 0 } {
			break
		}
	}

	# Close the new master's handle for the upgrade-test database;  we
	# don't need it.  Then check to make sure the client did in fact
	# update the database.
	error_check_good client_upg_db_close [$client_upg_db close] 0
	set newclient_upg_db [berkdb_open -env $newclientenv rep0$tnum-upg.db]
	error_check_good newclient_upg_db_get [$newclient_upg_db get hello] \
	    [list [list hello there]]
	error_check_good newclient_upg_db_close [$newclient_upg_db close] 0

	# Verify the database in the client dir.
	puts "\tRep0$tnum.j: Verifying new client database contents."
	set testdir [get_home $newmasterenv]
	set t1 $testdir/t1
	set t2 $testdir/t2
	set t3 $testdir/t3
	open_and_dump_file test0$tnum.db $newclientenv $t1 \
	    $checkfunc dump_file_direction "-first" "-next"

	if { [string compare [convert_method $method] -recno] != 0 } {
		filesort $t1 $t3
	}
	error_check_good diff_files($t2,$t3) [filecmp $t2 $t3] 0


	error_check_good newmasterenv_close [$newmasterenv close] 0
	error_check_good newclientenv_close [$newclientenv close] 0

	if { [lsearch $envargs "-encrypta*"] !=-1 } {
		set encrypt 1
	}
	error_check_good verify \
	    [verify_dir $clientdir "\tRep0$tnum.k: " 0 0 1] 0
	replclose $testdir/MSGQUEUEDIR
}