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