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
}
|