File: repmgr032.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 (158 lines) | stat: -rw-r--r-- 4,596 bytes parent folder | download | duplicates (8)
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
# See the file LICENSE for redistribution information.
#
# Copyright (c) 2011, 2013 Oracle and/or its affiliates.  All rights reserved.
#
# TEST	repmgr032
# TEST	The (undocumented) AUTOROLLBACK config feature.

proc repmgr032 { { tnum 032 } args } {
	source ./include.tcl
	global databases_in_memory

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

	# This test needs to have explicit control over whether/which databases
	# are on disk versus in memory.
	# 
	if { $databases_in_memory } {
		puts "Skipping repmgr$tnum for databases_in_memory"
		return
	}

	set method "btree"
	set args [convert_args $method $args]
	foreach test_case {normal do_close nimdbs} {
		puts "Repmgr$tnum: preventing auto-rollback, $test_case case"
		repmgr032_sub $method $tnum $test_case $args
	}
}

proc repmgr032_sub { method tnum test_case largs } {
	global testdir 
	global repfiles_in_memory
	global rep_verbose
	global verbose_type
	
	switch $test_case {
		normal { 
			set do_close false 
			set nimdbs false
		}
		do_close {
			set do_close true
			set nimdbs false
		}
		nimdbs {
			set do_close true
			set nimdbs true
		}
	}

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

	set repmemargs ""
	if { $repfiles_in_memory } {
		set repmemargs "-rep_inmem_files "
	}

	env_cleanup $testdir
	file mkdir [set dira $testdir/SITE_A]
	file mkdir [set dirb $testdir/SITE_B]
	file mkdir [set dirc $testdir/SITE_C]
	foreach { porta portb portc } [available_ports 3] {}

	set common "-create -txn $verbargs $repmemargs \
	    -rep -thread -event "
	set common_mgr "-msgth 2"

	puts "\tRepmgr$tnum.a: Start sites."
	set cmda "berkdb_env_noerr $common -errpfx SITE_A -home $dira"
	set enva [eval $cmda]
	$enva rep_config {mgrelections off}
	eval $enva repmgr $common_mgr -ack allavailable \
	    -local {[list 127.0.0.1 $porta]} -start master

	if { $nimdbs } {
		set omethod [convert_method $method]
		set db [eval {berkdb_open_noerr} -env $enva -auto_commit\
		     -create -mode 0644 $omethod $largs {"" nim.db}]
		set niter 10
		eval rep_test $method $enva $db $niter 0 0 0 $largs
		$db close
	}

	set cmdb "berkdb_env_noerr $common -errpfx SITE_B -home $dirb"
	set envb [eval $cmdb]
	$envb rep_config {mgrelections off}
	eval $envb repmgr $common_mgr -start client \
	    -local {[list 127.0.0.1 $portb]} -remote {[list 127.0.0.1 $porta]}
	await_startup_done $envb

	set cmdc "berkdb_env_noerr $common -errpfx SITE_C -home $dirc"
	set envc [eval $cmdc]
	$envc rep_config {mgrelections off}
	$envc rep_config {autorollback off}
	eval $envc repmgr $common_mgr -start client \
	    -local {[list 127.0.0.1 $portc]} -remote {[list 127.0.0.1 $porta]}
	await_startup_done $envc

	puts "\tRepmgr$tnum.b: Run some transactions at master."
	set niter 20
	eval rep_test $method $enva NULL $niter 0 0 0 $largs

	# Remember where we are in the log.  Use a log cursor to read the last
	# record in the log, then do one more transaction, then read the log end
	# again.  This gives us a lower and upper bound on where the sync point
	# should be.
	# 
	set logc [$enva log_cursor]
	set lower [lindex [$logc get -last] 0]
	eval rep_test $method $enva NULL 1 0 0 0 $largs
	set upper [lindex [$logc get -last] 0]
	$logc close

	puts "\tRepmgr$tnum.c: Shut down client B, then do a few more txns"
	$envb close
	eval rep_test $method $enva NULL $niter 0 0 0 $largs

	puts "\tRepmgr$tnum.d: Kill master, and restart client B as new master"
	if { $do_close } {
		$envc close
	}
	$enva close
	# maybe wait for masterfailure event at env b?
	set envb [eval $cmdb]
	$envb rep_config {mgrelections off}
	eval $envb repmgr $common_mgr -start master \
	    -local {[list 127.0.0.1 $portb]} -remote {[list 127.0.0.1 $portc]}

	if { $do_close } {
		set envc [eval $cmdc -recover]
		$envc rep_config {autorollback off}
		eval $envc repmgr $common_mgr -start client \
		    -local {[list 127.0.0.1 $portc]} \
		    -remote {[list 127.0.0.1 $portb]}
	}
	puts "\tRepmgr$tnum.e: Wait for WOULD_ROLLBACK event."
	await_condition {[is_event_present $envc would_rollback]}

	set sync_point [lindex [find_event [$envc event_info] would_rollback] 1]
	puts "\tRepmgr$tnum.f: Reported sync point is $sync_point"

	error_check_good lower_bound [$envb log_compare $lower $sync_point] -1

	# The upper bound must be >= to the sync point, which means log_compare
	# must *NOT* return a -1.  The other possible values (0, 1) are OK.
	# 
	error_check_bad upper_bound [$envb log_compare $upper $sync_point] -1

	$envc close
	$envb close
	set be_quiet ""
}