1# See the file LICENSE for redistribution information. 2# 3# Copyright (c) 2001,2008 Oracle. All rights reserved. 4# 5# $Id: rep014.tcl,v 12.16 2008/01/08 20:58:53 bostic Exp $ 6# 7# TEST rep014 8# TEST Replication and multiple replication handles. 9# TEST Test multiple client handles, opening and closing to 10# TEST make sure we get the right openfiles. 11# 12proc rep014 { method { niter 10 } { tnum "014" } args } { 13 14 source ./include.tcl 15 if { $is_windows9x_test == 1 } { 16 puts "Skipping replication test on Win 9x platform." 17 return 18 } 19 20 # Run for all access methods. 21 if { $checking_valid_methods } { 22 return "ALL" 23 } 24 25 # We can't open two envs on HP-UX, so just skip the 26 # whole test since that is at the core of it. 27 if { $is_hp_test == 1 } { 28 puts "Rep$tnum: Skipping for HP-UX." 29 return 30 } 31 32 set args [convert_args $method $args] 33 set logsets [create_logsets 2] 34 35 # Run the body of the test with and without recovery. 36 foreach r $test_recopts { 37 foreach l $logsets { 38 set logindex [lsearch -exact $l "in-memory"] 39 if { $r == "-recover" && $logindex != -1 } { 40 puts "Rep$tnum: Skipping\ 41 for in-memory logs with -recover." 42 continue 43 } 44 puts "Rep$tnum ($method $r): Replication and openfiles." 45 puts "Rep$tnum: Master logs are [lindex $l 0]" 46 puts "Rep$tnum: Client logs are [lindex $l 1]" 47 rep014_sub $method $niter $tnum $l $r $args 48 } 49 } 50} 51 52proc rep014_sub { method niter tnum logset recargs largs } { 53 global testdir 54 global rep_verbose 55 global verbose_type 56 57 set verbargs "" 58 if { $rep_verbose == 1 } { 59 set verbargs " -verbose {$verbose_type on} " 60 } 61 62 env_cleanup $testdir 63 set orig_tdir $testdir 64 65 replsetup $testdir/MSGQUEUEDIR 66 67 set masterdir $testdir/MASTERDIR 68 set clientdir $testdir/CLIENTDIR 69 file mkdir $masterdir 70 file mkdir $clientdir 71 72 set m_logtype [lindex $logset 0] 73 set c_logtype [lindex $logset 1] 74 75 # In-memory logs require a large log buffer, and cannot 76 # be used with -txn nosync. 77 set m_logargs [adjust_logargs $m_logtype] 78 set c_logargs [adjust_logargs $c_logtype] 79 set m_txnargs [adjust_txnargs $m_logtype] 80 set c_txnargs [adjust_txnargs $c_logtype] 81 82 # Open a master. 83 repladd 1 84 set ma_envcmd "berkdb_env_noerr -create $m_txnargs $m_logargs \ 85 $verbargs -errpfx MASTER -home $masterdir \ 86 -rep_transport \[list 1 replsend\]" 87 set env0 [eval $ma_envcmd $recargs -rep_master] 88 set masterenv $env0 89 90 # Open a client. 91 repladd 2 92 set cl_envcmd "berkdb_env_noerr -create $c_txnargs $c_logargs \ 93 $verbargs -errpfx CLIENT1 -home $clientdir \ 94 -rep_transport \[list 2 replsend\]" 95 set env1 [eval $cl_envcmd $recargs] 96 error_check_good client_env [is_valid_env $env1] TRUE 97 set env2 [eval $cl_envcmd] 98 error_check_good client_env [is_valid_env $env2] TRUE 99 100 error_check_good e1_cl [$env1 rep_start -client] 0 101 102 set testfile "test$tnum.db" 103 set omethod [convert_method $method] 104 set env0db [eval {berkdb_open_noerr -env $env0 -auto_commit \ 105 -create -mode 0644} $largs $omethod $testfile] 106 set masterdb $env0db 107 error_check_good dbopen [is_valid_db $env0db] TRUE 108 109 # Bring the clients online by processing the startup messages. 110 set envlist "{$env0 1} {$env1 2}" 111 process_msgs $envlist 112 113 # Run a modified test001 in the master (and update clients). 114 puts "\tRep$tnum.a: Running test001 in replicated env." 115 eval rep_test $method $masterenv $masterdb $niter 0 0 0 0 $largs 116 process_msgs $envlist 117 118 puts "\tRep$tnum.b: Close and reopen client env." 119 error_check_good env1_close [$env1 close] 0 120 set env1 [eval $cl_envcmd] 121 error_check_good client_env [is_valid_env $env1] TRUE 122 error_check_good e1_cl [$env1 rep_start -client] 0 123 124 puts "\tRep$tnum.c: Run test in master again." 125 set start $niter 126 eval rep_test $method $masterenv $masterdb $niter $start 0 0 0 $largs 127 set envlist "{$env0 1} {$env1 2}" 128 process_msgs $envlist 129 130 puts "\tRep$tnum.d: Start and close 2nd client env." 131 error_check_good e2_pfx [$env2 errpfx CLIENT2] 0 132 error_check_good e2_cl [$env2 rep_start -client] 0 133 error_check_good env2_close [$env2 close] 0 134 135 puts "\tRep$tnum.e: Run test in master again." 136 set start [expr $start + $niter] 137 error_check_good e1_pfx [$env1 errpfx CLIENT1] 0 138 eval rep_test $method $masterenv $masterdb $niter $start 0 0 0 $largs 139 process_msgs $envlist 140 141 puts "\tRep$tnum.f: Open env2, close env1, use env2." 142 set env2 [eval $cl_envcmd] 143 error_check_good client_env [is_valid_env $env2] TRUE 144 error_check_good e1_pfx [$env2 errpfx CLIENT2] 0 145 error_check_good e2_cl [$env2 rep_start -client] 0 146 error_check_good e1_pfx [$env1 errpfx CLIENT1] 0 147 error_check_good env1_close [$env1 close] 0 148 149 puts "\tRep$tnum.g: Run test in master again." 150 set start [expr $start + $niter] 151 error_check_good e1_pfx [$env2 errpfx CLIENT2] 0 152 eval rep_test $method $masterenv $masterdb $niter $start 0 0 0 $largs 153 set envlist "{$env0 1} {$env2 2}" 154 process_msgs $envlist 155 156 puts "\tRep$tnum.h: Closing" 157 error_check_good env0db [$env0db close] 0 158 error_check_good env0_close [$env0 close] 0 159 error_check_good env2_close [$env2 close] 0 160 replclose $testdir/MSGQUEUEDIR 161 set testdir $orig_tdir 162 return 163} 164