File: repmgr031.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 (107 lines) | stat: -rw-r--r-- 3,467 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
# See the file LICENSE for redistribution information.
#
# Copyright (c) 2010, 2013 Oracle and/or its affiliates.  All rights reserved.
#
# $Id$
# Test for ack policies that vary throughout the group, and that change
# dynamically.
# 
proc repmgr031 { } {
	global rep_verbose
	global testdir
	
	set rv off
	if { $rep_verbose == 1 } {
		set rv on
	}
	
	set tnum "031"

	env_cleanup $testdir
	foreach {portA portB portC} [available_ports 3] {}
	
	set dirA $testdir/A
	set dirB $testdir/B
	set dirC $testdir/C
	
	file mkdir $dirA
	file mkdir $dirB
	file mkdir $dirC
    
	puts -nonewline "\tRepmgr$tnum: Set up a group of 3:"
	set envA [berkdb env -create -errpfx A -home $dirA -txn -rep -thread \
		      -recover -verbose [list rep $rv] -event]
	$envA rep_config {mgrelections off}
	$envA repmgr -local [list 127.0.0.1 $portA] -start master -ack none
	puts -nonewline "." ; 	flush stdout
	
	set envB [berkdb env -create -errpfx B -home $dirB -txn -rep -thread \
		      -recover -verbose [list rep $rv]]
	$envB rep_config {mgrelections off}
	$envB repmgr -local [list 127.0.0.1 $portB] \
	    -remote [list 127.0.0.1 $portA] -start client
	await_startup_done $envB
	puts -nonewline "." ; 	flush stdout
	
	set envC [berkdb env -create -errpfx C -home $dirC -txn -rep -thread \
		      -recover -verbose [list rep $rv] -event]
	$envC rep_config {mgrelections off}
	$envC repmgr -local [list 127.0.0.1 $portC] \
	    -remote [list 127.0.0.1 $portA] -start client -ack none
	await_startup_done $envC
	puts "."

	puts "\tRepmgr$tnum: Shut down site B."
	$envB close

	puts "\tRepmgr$tnum: Write updates and check perm_failed event."
	# Initially sites A and C both have "none" policy.  Site C won't even
	# bother to send an ack, which is just fine with site A.
	# 
	$envA event_info -clear
	set method btree
	set niter 1
	eval rep_test $method $envA NULL $niter 0 0 0
	error_check_good nofailure \
	    [string length [find_event  [$envA event_info] perm_failed]] 0

	# Change ack policy at site A.  Site C will have to be notified of this
	# change, or else the lack of an ack would cause a perm failure.
	# 
	$envA repmgr -ack quorum
	eval rep_test $method $envA NULL $niter 0 0 0
	error_check_good nofailure \
	    [string length [find_event  [$envA event_info] perm_failed]] 0

	puts "\tRepmgr$tnum: Shut down site A, make site C new master."
	# Even though site C started sending acks for site A's benefit, its own
	# ack policy should still be "none".  With no other sites running, that
	# will be the only way to avoid perm_failed event.
	# 
	$envA close
	$envC repmgr -start master -msgth 0
	eval rep_test $method $envC NULL $niter 0 0 0
	error_check_good nofailure \
	    [string length [find_event  [$envC event_info] perm_failed]] 0
	
	puts "\tRepmgr$tnum: Change ack policy to quorum."
	$envC repmgr -ack quorum
	eval rep_test $method $envC NULL $niter 0 0 0
	error_check_bad failure \
	    [string length [find_event  [$envC event_info] perm_failed]] 0

	puts "\tRepmgr$tnum: Start site B, to provide acks needed by site C"
	$envC event_info -clear
	set envB [berkdb env -create -errpfx B -home $dirB -txn -rep -thread \
		      -recover -verbose [list rep $rv]]
	$envB rep_config {mgrelections off}
	$envB repmgr -local [list 127.0.0.1 $portB] -start client
	await_startup_done $envB
	
	eval rep_test $method $envC NULL $niter 0 0 0
	error_check_good failure \
	    [string length [find_event  [$envC event_info] perm_failed]] 0

	$envB close
	$envC close
}