libdb/test/tcl/repmgr027.tcl
2011-09-13 13:44:24 -04:00

125 lines
4 KiB
Tcl

# See the file LICENSE for redistribution information.
#
# Copyright (c) 2009, 2011 Oracle and/or its affiliates. All rights reserved.
#
# TEST repmgr027
# TEST Test of "full election" timeouts, where a client starts up and joins the
# TEST group during the middle of an election.
# TEST
proc repmgr027 { { tnum 027 } } {
source ./include.tcl
if { $is_freebsd_test == 1 } {
puts "Skipping replication manager test on FreeBSD platform."
return
}
puts -nonewline "Repmgr$tnum: Full election test,"
puts " with client joining halfway through election"
repmgr027_sub $tnum
}
proc repmgr027_sub { tnum } {
global testdir
global repfiles_in_memory
global rep_verbose
global verbose_type
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] {}
# The election times are arbitrary, but the full election timeout should
# be long enough to allow the test to start two sites, wait for them to
# be in an election, and then have the third site start and join
# (including the leeway time, in seconds), before it times out.
#
set common "-create -txn $verbargs $repmemargs \
-rep -thread -event -recover"
set common_mgr "-start elect \
-timeout {connection_retry 5000000} \
-timeout {election_retry 2000000} \
-timeout {full_election 180000000} \
-timeout {election 5000000}"
set leeway 5
# Start by simply establishing the group. Then we can shut down and get
# started with the interesting cold-boot scenarios.
set cmda "berkdb_env_noerr $common -errpfx SITE_A -home $dira"
set cmdb "berkdb_env_noerr $common -errpfx SITE_B -home $dirb"
set cmdc "berkdb_env_noerr $common -errpfx SITE_C -home $dirc"
set enva [eval $cmda]
eval $enva repmgr $common_mgr -local {[list localhost $porta creator]}
set envb [eval $cmdb]
eval $envb repmgr $common_mgr \
-local {[list localhost $portb]} -remote {[list localhost $porta]}
await_startup_done $envb
set envc [eval $cmdc]
eval $envc repmgr $common_mgr \
-local {[list localhost $portc]} -remote {[list localhost $porta]}
await_startup_done $envc
$envc close
$envb close
$enva close
# Cold boot, at first just 2 sites.
#
puts "\tRepmgr$tnum.a: Start first two sites."
set enva [eval $cmda]
eval $enva repmgr $common_mgr -pri 200 -local {[list localhost $porta]}
set envb [eval $cmdb]
eval $envb repmgr $common_mgr -pri 100 -local {[list localhost $portb]}
# Wait until both sites recognize that they're in an election, plus a
# few extra seconds just for good measure.
#
await_condition {[expr \
[stat_field $enva rep_stat "Election phase"] == 1 && \
[stat_field $envb rep_stat "Election phase"] == 1]}
tclsleep $leeway
# At this point we should not have completed an election yet, even
# though we have a majority, because we don't have full participation.
#
error_check_bad site_a_elected [is_elected $enva] 1
error_check_bad site_b_elected [is_elected $envb] 1
puts "\tRepmgr$tnum.c: Start 3rd site."
set envc [eval $cmdc]
eval $envc repmgr $common_mgr -pri 100 -local {[list localhost $portc]}
# Wait for results, and make sure they're correct. The election should
# complete right away, once the third client has joined, regardless of
# the election timeout values. We wait an arbitrary maximum of 60
# seconds, merely so that the test doesn't hang forever if something
# goes horribly wrong.
#
set envlist [list $enva $envb $envc]
set limit 60
puts "\tRepmgr$tnum.c: wait (up to $limit seconds) for election."
set t [repmgr026_await_election_result $envlist $limit]
error_check_good timely_election [expr $t < 2 * $leeway] 1
puts "\tRepmgr$tnum.d: first election completed in $t seconds"
puts "\tRepmgr$tnum.e: wait for start-up done"
await_startup_done $envb
await_startup_done $envc
$envb close
$envc close
$enva close
}