1# See the file LICENSE for redistribution information. 2# 3# Copyright (c) 2007,2008 Oracle. All rights reserved. 4# 5# $Id: rep076.tcl,v 12.5 2008/01/08 20:58:53 bostic Exp $ 6# 7# TEST rep076 8# TEST Replication elections - what happens if elected client 9# TEST does not become master? 10# TEST 11# TEST Set up a master and 3 clients. Take down master, run election. 12# TEST The elected client will ignore the fact that it's been elected, 13# TEST so we still have 2 clients. 14# TEST 15# TEST Run another election, a regular election that allows the winner 16# TEST to become master, and make sure it goes okay. We do this both 17# TEST for the client that ignored its election and for the other client. 18# TEST 19# TEST This simulates what would happen if, say, we had a temporary 20# TEST network partition and lost the winner. 21# 22proc rep076 { method args } { 23 source ./include.tcl 24 25 global mixed_mode_logging 26 set tnum "076" 27 if { $is_windows9x_test == 1 } { 28 puts "Skipping replication test on Win 9x platform." 29 return 30 } 31 32 # Run for btree only. 33 if { $checking_valid_methods } { 34 set test_methods { btree } 35 return $test_methods 36 } 37 if { [is_btree $method] == 0 } { 38 puts "Rep$tnum: Skipping for method $method." 39 return 40 } 41 42 set nclients 3 43 set logsets [create_logsets [expr $nclients + 1]] 44 set winsets { { 1 1 } { 1 2 } } 45 foreach l $logsets { 46 foreach w $winsets { 47 puts "Rep$tnum ($method): Replication elections -\ 48 elected client ignores election." 49 puts "Rep$tnum: Master logs are [lindex $l 0]" 50 for { set i 0 } { $i < $nclients } { incr i } { 51 puts "Rep$tnum: Client $i logs are\ 52 [lindex $l [expr $i + 1]]" 53 } 54 rep076_sub $method $nclients $tnum $l $w $args 55 } 56 } 57} 58 59proc rep076_sub { method nclients tnum logset winset largs } { 60 source ./include.tcl 61 global machids 62 global rep_verbose 63 global verbose_type 64 65 set verbargs "" 66 if { $rep_verbose == 1 } { 67 set verbargs " -verbose {$verbose_type on} " 68 } 69 70 env_cleanup $testdir 71 72 set qdir $testdir/MSGQUEUEDIR 73 replsetup $qdir 74 75 set masterdir $testdir/MASTERDIR 76 file mkdir $masterdir 77 set m_logtype [lindex $logset 0] 78 set m_logargs [adjust_logargs $m_logtype] 79 set m_txnargs [adjust_txnargs $m_logtype] 80 81 for { set i 0 } { $i < $nclients } { incr i } { 82 set clientdir($i) $testdir/CLIENTDIR.$i 83 file mkdir $clientdir($i) 84 set c_logtype($i) [lindex $logset [expr $i + 1]] 85 set c_logargs($i) [adjust_logargs $c_logtype($i)] 86 set c_txnargs($i) [adjust_txnargs $c_logtype($i)] 87 } 88 89 # Open a master. 90 set envlist {} 91 repladd 1 92 set env_cmd(M) "berkdb_env -create -log_max 1000000 $verbargs \ 93 -event rep_event \ 94 -home $masterdir $m_txnargs $m_logargs -rep_master \ 95 -errpfx MASTER -rep_transport \[list 1 replsend\]" 96 set masterenv [eval $env_cmd(M)] 97 lappend envlist "$masterenv 1" 98 99 # Open the clients. 100 for { set i 0 } { $i < $nclients } { incr i } { 101 set envid [expr $i + 2] 102 repladd $envid 103 set env_cmd($i) "berkdb_env_noerr -create $verbargs \ 104 -event rep_event \ 105 -home $clientdir($i) $c_txnargs($i) $c_logargs($i) \ 106 -rep_client -rep_transport \[list $envid replsend\]" 107 set clientenv($i) [eval $env_cmd($i)] 108 error_check_good \ 109 client_env($i) [is_valid_env $clientenv($i)] TRUE 110 lappend envlist "$clientenv($i) $envid" 111 } 112 113 # Bring the clients online by processing the startup messages. 114 process_msgs $envlist 115 116 # Run a modified test001 in the master. 117 puts "\tRep$tnum.a: Running rep_test in replicated env." 118 set niter 10 119 eval rep_test $method $masterenv NULL $niter 0 0 0 0 $largs 120 process_msgs $envlist 121 122 # Close master. 123 error_check_good masterenv_close [$masterenv close] 0 124 set envlist [lreplace $envlist 0 0] 125 126 # Winner1 is set up to win the first election, winner2 127 # the second. 128 set m "Rep$tnum.b" 129 set winner1 [lindex $winset 0] 130 set winner2 [lindex $winset 1] 131 set elector 1 132 set nsites $nclients 133 set nvotes $nclients 134 setpriority pri $nclients $winner1 135 foreach pair $envlist { 136 set i [expr [lindex $pair 1] - 2] 137 replclear [expr $i + 2] 138 set err_cmd($i) "none" 139 set crash($i) 0 140 if { $rep_verbose == 1 } { 141 $clientenv($i) errpfx CLIENT$i 142 $clientenv($i) verbose $verbose_type on 143 $clientenv($i) errfile /dev/stderr 144 set env_cmd($i) [concat $env_cmd($i) \ 145 "-errpfx CLIENT$i -errfile /dev/stderr"] 146 } 147 } 148 149 150 # Run election where winner will ignore its election and 151 # not be made master. 152 puts "\tRep$tnum: First winner ignores its election." 153 run_election env_cmd envlist err_cmd pri crash $qdir $m\ 154 $elector $nsites $nvotes $nclients $winner1 0 test.db 1 155 156 # Run second election where winner accepts its election and 157 # is made master. 158 puts "\tRep$tnum: Second winner accepts its election." 159 setpriority pri $nclients $winner2 160 run_election env_cmd envlist err_cmd pri crash $qdir $m\ 161 $elector $nsites $nvotes $nclients $winner2 0 test.db 162 163 # Clean up. 164 foreach pair $envlist { 165 set cenv [lindex $pair 0] 166 error_check_good cenv_close [$cenv close] 0 167 } 168 169 replclose $testdir/MSGQUEUEDIR 170} 171 172