summaryrefslogtreecommitdiff
path: root/db-4.8.30/test/repmgr027.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'db-4.8.30/test/repmgr027.tcl')
-rw-r--r--db-4.8.30/test/repmgr027.tcl216
1 files changed, 216 insertions, 0 deletions
diff --git a/db-4.8.30/test/repmgr027.tcl b/db-4.8.30/test/repmgr027.tcl
new file mode 100644
index 0000000..fe4181f
--- /dev/null
+++ b/db-4.8.30/test/repmgr027.tcl
@@ -0,0 +1,216 @@
+# See the file LICENSE for redistribution information.
+#
+# Copyright (c)-2009 Oracle. All rights reserved.
+#
+# TEST repmgr027
+# TEST Repmgr recognition of peer setting, across processes.
+# TEST
+# TEST Set up a master and two clients, synchronized with some data.
+# TEST Add a new client, configured to use c2c sync with one of the original
+# TEST clients. Check stats to make sure the correct c2c peer was used.
+
+proc repmgr027 { } {
+ repmgr027_sub position_chg
+ repmgr027_sub chg_site
+ repmgr027_sub chg_after_open
+ repmgr027_sub set_peer_after_open
+}
+
+proc repmgr027_sub { config } {
+ source ./include.tcl
+
+ set tnum "027"
+ puts "Repmgr$tnum: Repmgr peer, with \"$config\" configuration."
+ set site_prog [setup_site_prog]
+
+ env_cleanup $testdir
+
+ set ports [available_ports 4]
+ set mport [lindex $ports 0]
+ set portA [lindex $ports 1]
+ set portB [lindex $ports 2]
+
+ file mkdir [set masterdir $testdir/MASTER]
+ file mkdir $testdir/A
+ file mkdir $testdir/B
+ file mkdir $testdir/C
+
+ puts "\tRepmgr$tnum.a: Start master, write some data."
+ make_dbconfig $masterdir {{rep_set_nsites 4}}
+ set cmds {
+ "home $masterdir"
+ "local $mport"
+ "output $testdir/moutput"
+ "open_env"
+ "start master"
+ "open_db test.db"
+ "put key1 value1"
+ }
+ set m [open_site_prog [subst $cmds]]
+
+ puts "\tRepmgr$tnum.b:\
+ Start initial two clients; wait for them to synchronize."
+ # Allowing both A and B to start at the same time, and synchronize
+ # concurrently would make sense. But it causes very slow performance on
+ # Windows. Since it's really only client C that's under test here, this
+ # detail doesn't matter.
+ #
+ make_dbconfig $testdir/A {{rep_set_nsites 4}}
+ set a [open_site_prog [list \
+ "home $testdir/A" \
+ "local $portA" \
+ "output $testdir/aoutput" \
+ "remote localhost $mport" \
+ "open_env" \
+ "start client"]]
+ set env [berkdb_env -home $testdir/A]
+ await_startup_done $env
+ $env close
+
+ make_dbconfig $testdir/B {{rep_set_nsites 4}}
+ set b [open_site_prog [list \
+ "home $testdir/B" \
+ "local $portB" \
+ "output $testdir/boutput" \
+ "remote localhost $mport" \
+ "open_env" \
+ "start client"]]
+ set env [berkdb_env -home $testdir/B]
+ await_startup_done $env
+ $env close
+
+ # Client C is the one whose behavior is being tested. It has two
+ # processes. "c" will be the main replication process, and "c2" the
+ # subordinate process. The initial configuration commands used to set
+ # up the two processes vary slightly with each test. The variable
+ # $config contains the name of the proc which will fill out the
+ # configuration information appropriately for each test variant.
+ #
+ puts "\tRepmgr$tnum.c: Start client under test."
+ make_dbconfig $testdir/C {{rep_set_nsites 4}}
+
+ set c2 [list \
+ "home $testdir/C" \
+ "local [lindex $ports 3]" \
+ "output $testdir/c2output" \
+ "open_env"]
+ set c [list \
+ "home $testdir/C" \
+ "local [lindex $ports 3]" \
+ "output $testdir/coutput" \
+ "open_env"]
+ set lists [repmgr027_$config $c2 $c]
+ set c2 [lindex $lists 0]
+ set c [lindex $lists 1]
+
+ # Ugly hack: in this one case, the order of opening the two client
+ # processes has to be reversed.
+ #
+ if {$config == "chg_after_open"} {
+ set c [open_site_prog $c]
+ set c2 [open_site_prog $c2]
+ } else {
+ set c2 [open_site_prog $c2]
+ set c [open_site_prog $c]
+ }
+ puts $c "start client"
+ gets $c
+
+ puts "\tRepmgr$tnum.d: Wait for startup-done at test client."
+ set env [berkdb_env -home $testdir/C]
+ await_startup_done $env 27
+ $env close
+
+ puts "\tRepmgr$tnum.e: Check stats to make sure proper peer was used."
+ set env [berkdb_env -home $testdir/A]
+ set reqs [stat_field $env rep_stat "Client service requests"]
+ error_check_good used_client_A [expr {$reqs > 0}] 1
+ $env close
+ set env [berkdb_env -home $testdir/B]
+ set reqs [stat_field $env rep_stat "Client service requests"]
+ error_check_good didnt_use_b [expr {$reqs == 0}] 1
+ $env close
+
+ puts "\tRepmgr$tnum.f: Clean up."
+ close $c2
+ close $c
+ close $b
+ close $a
+ close $m
+}
+
+# Scenario 1: client A is the peer; C2 sets B, A; C sets A. For C, this means
+# no peer change, but its position in the list changes, requiring some tricky
+# shuffling.
+#
+proc repmgr027_position_chg { c2 c } {
+ set remote_config [uplevel 1 {list \
+ "remote localhost $mport" \
+ "remote localhost $portB" \
+ "remote -p localhost $portA"}]
+ set i [lsearch -exact $c2 "open_env"]
+
+ # It should be found, in the middle somewhere, or this will break.
+ set c2 "[lrange $c2 0 [expr $i - 1]] $remote_config [lrange $c2 $i end]"
+
+ set remote_config [uplevel 1 {list \
+ "remote -p localhost $portA" \
+ "remote localhost $mport"}]
+ set i [lsearch -exact $c "open_env"]
+ set c "[lrange $c 0 [expr $i - 1]] $remote_config [lrange $c $i end]"
+
+ return [list $c2 $c]
+}
+
+# C2 first sets the peer as B, but then C comes along and changes it to A.
+#
+proc repmgr027_chg_site { c2 c } {
+ set remote_config [uplevel 1 {list \
+ "remote localhost $mport" \
+ "remote -p localhost $portB"}]
+ set i [lsearch -exact $c2 "open_env"]
+
+ # It should be found, in the middle somewhere, or this will break.
+ set c2 "[lrange $c2 0 [expr $i - 1]] $remote_config [lrange $c2 $i end]"
+
+ set remote_config [uplevel 1 {list \
+ "remote -p localhost $portA" \
+ "remote localhost $mport"}]
+ set i [lsearch -exact $c "open_env"]
+ set c "[lrange $c 0 [expr $i - 1]] $remote_config [lrange $c $i end]"
+
+ return [list $c2 $c]
+}
+
+# C first sets B as its peer, and creates the env. Then C2 comes along and
+# changes it to A. C will have to learn of the change on the fly, rather than
+# at env open/join time. Even though the actual order of process creation will
+# be reversed (by the caller), we still conform to the convention of putting C2
+# first, and then C, in the ordered list.
+#
+proc repmgr027_chg_after_open { c2 c } {
+ set remote_config [uplevel 1 {list \
+ "remote localhost $mport" \
+ "remote -p localhost $portA"}]
+ set i [lsearch -exact $c2 "open_env"]
+
+ # It should be found, in the middle somewhere, or this will break.
+ set c2 "[lrange $c2 0 [expr $i - 1]] $remote_config [lrange $c2 $i end]"
+
+ set remote_config [uplevel 1 {list \
+ "remote -p localhost $portB" \
+ "remote localhost $mport"}]
+ set i [lsearch -exact $c "open_env"]
+ set c "[lrange $c 0 [expr $i - 1]] $remote_config [lrange $c $i end]"
+
+ return [list $c2 $c]
+}
+
+# Nothing especially exotic here, except this exercises a code path where I
+# previously discovered a bug.
+#
+proc repmgr027_set_peer_after_open { c2 c } {
+ set remote_config [uplevel 1 {subst "remote -p localhost $portA"}]
+ lappend c $remote_config
+ return [list $c2 $c]
+}