1# See the file LICENSE for redistribution information. 2# 3# Copyright (c)-2009 Oracle. All rights reserved. 4# 5# TEST repmgr028 6# TEST Simple smoke test for repmgr elections with multi-process envs. 7 8proc repmgr028 { } { 9 source ./include.tcl 10 11 set tnum "028" 12 puts "Repmgr$tnum:\ 13 Smoke test for repmgr elections with multi-process envs." 14 15 env_cleanup $testdir 16 17 set ports [available_ports 3] 18 19 set dbconfig { 20 {rep_set_nsites 3} 21 {rep_set_timeout DB_REP_ELECTION_RETRY 2000000} 22 {rep_set_timeout DB_REP_ELECTION_TIMEOUT 1000000} 23 } 24 foreach d {A B C} { 25 file mkdir $testdir/$d 26 make_dbconfig $testdir/$d $dbconfig 27 } 28 29 puts "\tRepmgr$tnum.a: Start 3 sites (with 2 processes each)." 30 set cmds { 31 {home $testdir/A} 32 {local [lindex $ports 0]} 33 {open_env} 34 {start election} 35 } 36 set cmds [subst $cmds] 37 set a1 [open_site_prog [linsert $cmds 1 "output $testdir/a1output"]] 38 set a2 [open_site_prog [linsert $cmds 1 "output $testdir/a2output"]] 39 40 set cmds { 41 {home $testdir/B} 42 {local [lindex $ports 1]} 43 {remote localhost [lindex $ports 0]} 44 {open_env} 45 {start election} 46 } 47 set cmds [subst $cmds] 48 set b1 [open_site_prog [linsert $cmds 1 "output $testdir/b1output"]] 49 set b2 [open_site_prog [linsert $cmds 1 "output $testdir/b2output"]] 50 51 set cmds { 52 {home $testdir/C} 53 {local [lindex $ports 2]} 54 {remote localhost [lindex $ports 0]} 55 {open_env} 56 {start election} 57 } 58 set cmds [subst $cmds] 59 set c1 [open_site_prog [linsert $cmds 1 "output $testdir/c1output"]] 60 set c2 [open_site_prog [linsert $cmds 1 "output $testdir/c2output"]] 61 62 puts "\tRepmgr$tnum.b: Wait for an election to choose initial master." 63 set a [berkdb_env -home $testdir/A] 64 set b [berkdb_env -home $testdir/B] 65 set c [berkdb_env -home $testdir/C] 66 set sites "$a $b $c" 67 set menv [repmgr028_await_election $sites] 68 set i [lsearch -exact $sites $menv] 69 error_check_bad notfound $i -1 70 set site_names "abc" 71 set m [string range $site_names $i $i] 72 puts "\tRepmgr$tnum.c: (site $m is master)." 73 74 puts "\tRepmgr$tnum.d: Wait for other two sites to sync up." 75 set clients [lreplace $sites $i $i] 76 set site_names [string replace $site_names $i $i] 77 await_startup_done [lindex $clients 0] 78 await_startup_done [lindex $clients 1] 79 80 set m1 [subst $${m}1] 81 set m2 [subst $${m}2] 82 83 puts $m2 "open_db test.db" 84 puts $m2 "put key1 value1" 85 puts $m2 "echo done" 86 gets $m2 87 88 puts "\tRepmgr$tnum.e:\ 89 Shut down master, wait for survivors to elect new master." 90 $menv close 91 close $m1 92 close $m2 93 94 set menv [repmgr028_await_election $clients] 95 set i [lsearch -exact $clients $menv] 96 error_check_bad notfound2 $i -1 97 set m [string range $site_names $i $i] 98 puts "\tRepmgr$tnum.f: (site $m is new master)." 99 100 puts "\tRepmgr$tnum.g: Wait for remaining client to sync to new master." 101 set client [lreplace $clients $i $i] 102 error_check_good master_changes \ 103 [stat_field $client rep_stat "Master changes"] 2 104 await_startup_done $client 105 106 puts "\tRepmgr$tnum.h: Clean up." 107 $client close 108 $menv close 109 110 set c [string range $site_names 0 0] 111 close [subst $${c}1] 112 close [subst $${c}2] 113 set c [string range $site_names 1 1] 114 close [subst $${c}1] 115 close [subst $${c}2] 116} 117 118proc repmgr028_await_election { env_list } { 119 set cond { 120 foreach e $env_list { 121 if {[stat_field $e rep_stat "Role"] == "master"} { 122 set answer $e 123 break 124 } 125 } 126 expr {[info exists answer]} 127 } 128 await_condition {[eval $cond]} 20 129 return $answer 130} 131