1# See the file LICENSE for redistribution information. 2# 3# Copyright (c) 2001-2009 Oracle. All rights reserved. 4# 5# $Id$ 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 global databases_in_memory 16 global repfiles_in_memory 17 18 if { $is_windows9x_test == 1 } { 19 puts "Skipping replication test on Win 9x platform." 20 return 21 } 22 23 # Run for all access methods. 24 if { $checking_valid_methods } { 25 return "ALL" 26 } 27 28 # We can't open two envs on HP-UX, so just skip the 29 # whole test since that is at the core of it. 30 if { $is_hp_test == 1 } { 31 puts "Rep$tnum: Skipping for HP-UX." 32 return 33 } 34 35 set args [convert_args $method $args] 36 set logsets [create_logsets 2] 37 38 # Set up for on-disk or in-memory databases. 39 set msg "using on-disk databases" 40 if { $databases_in_memory } { 41 set msg "using named in-memory databases" 42 if { [is_queueext $method] } { 43 puts -nonewline "Skipping rep$tnum for method " 44 puts "$method with named in-memory databases." 45 return 46 } 47 } 48 49 set msg2 "and on-disk replication files" 50 if { $repfiles_in_memory } { 51 set msg2 "and in-memory replication files" 52 } 53 54 # Run the body of the test with and without recovery. 55 foreach r $test_recopts { 56 foreach l $logsets { 57 set logindex [lsearch -exact $l "in-memory"] 58 if { $r == "-recover" && $logindex != -1 } { 59 puts "Rep$tnum: Skipping\ 60 for in-memory logs with -recover." 61 continue 62 } 63 puts "Rep$tnum ($method $r): Replication\ 64 and openfiles $msg $msg2." 65 puts "Rep$tnum: Master logs are [lindex $l 0]" 66 puts "Rep$tnum: Client logs are [lindex $l 1]" 67 rep014_sub $method $niter $tnum $l $r $args 68 } 69 } 70} 71 72proc rep014_sub { method niter tnum logset recargs largs } { 73 global testdir 74 global databases_in_memory 75 global repfiles_in_memory 76 global rep_verbose 77 global verbose_type 78 79 set verbargs "" 80 if { $rep_verbose == 1 } { 81 set verbargs " -verbose {$verbose_type on} " 82 } 83 84 set repmemargs "" 85 if { $repfiles_in_memory } { 86 set repmemargs "-rep_inmem_files " 87 } 88 89 env_cleanup $testdir 90 set orig_tdir $testdir 91 92 replsetup $testdir/MSGQUEUEDIR 93 94 set masterdir $testdir/MASTERDIR 95 set clientdir $testdir/CLIENTDIR 96 file mkdir $masterdir 97 file mkdir $clientdir 98 99 set m_logtype [lindex $logset 0] 100 set c_logtype [lindex $logset 1] 101 102 # In-memory logs require a large log buffer, and cannot 103 # be used with -txn nosync. 104 set m_logargs [adjust_logargs $m_logtype] 105 set c_logargs [adjust_logargs $c_logtype] 106 set m_txnargs [adjust_txnargs $m_logtype] 107 set c_txnargs [adjust_txnargs $c_logtype] 108 109 # Open a master. 110 repladd 1 111 set ma_envcmd "berkdb_env_noerr -create $m_txnargs $m_logargs \ 112 $verbargs -errpfx MASTER -home $masterdir $repmemargs \ 113 -rep_transport \[list 1 replsend\]" 114 set env0 [eval $ma_envcmd $recargs -rep_master] 115 set masterenv $env0 116 117 # Open a client. 118 repladd 2 119 set cl_envcmd "berkdb_env_noerr -create $c_txnargs $c_logargs \ 120 $verbargs -errpfx CLIENT1 -home $clientdir $repmemargs \ 121 -rep_transport \[list 2 replsend\]" 122 set env1 [eval $cl_envcmd $recargs] 123 error_check_good client_env [is_valid_env $env1] TRUE 124 set env2 [eval $cl_envcmd] 125 error_check_good client_env [is_valid_env $env2] TRUE 126 127 error_check_good e1_cl [$env1 rep_start -client] 0 128 129 # Set up databases for in-memory or on-disk. 130 if { $databases_in_memory } { 131 set testfile { "" "test.db" } 132 } else { 133 set testfile "test.db" 134 } 135 136 set omethod [convert_method $method] 137 set env0db [eval {berkdb_open_noerr -env $env0 -auto_commit \ 138 -create -mode 0644} $largs $omethod $testfile] 139 set masterdb $env0db 140 error_check_good dbopen [is_valid_db $env0db] TRUE 141 142 # Bring the clients online by processing the startup messages. 143 set envlist "{$env0 1} {$env1 2}" 144 process_msgs $envlist 145 146 # Run a modified test001 in the master (and update clients). 147 puts "\tRep$tnum.a: Running test001 in replicated env." 148 eval rep_test $method $masterenv $masterdb $niter 0 0 0 $largs 149 process_msgs $envlist 150 151 puts "\tRep$tnum.b: Close and reopen client env." 152 error_check_good env1_close [$env1 close] 0 153 set env1 [eval $cl_envcmd] 154 error_check_good client_env [is_valid_env $env1] TRUE 155 error_check_good e1_cl [$env1 rep_start -client] 0 156 157 puts "\tRep$tnum.c: Run test in master again." 158 set start $niter 159 eval rep_test $method $masterenv $masterdb $niter $start 0 0 $largs 160 set envlist "{$env0 1} {$env1 2}" 161 process_msgs $envlist 162 163 puts "\tRep$tnum.d: Start and close 2nd client env." 164 error_check_good e2_pfx [$env2 errpfx CLIENT2] 0 165 error_check_good e2_cl [$env2 rep_start -client] 0 166 error_check_good env2_close [$env2 close] 0 167 168 puts "\tRep$tnum.e: Run test in master again." 169 set start [expr $start + $niter] 170 error_check_good e1_pfx [$env1 errpfx CLIENT1] 0 171 eval rep_test $method $masterenv $masterdb $niter $start 0 0 $largs 172 process_msgs $envlist 173 174 puts "\tRep$tnum.f: Open env2, close env1, use env2." 175 set env2 [eval $cl_envcmd] 176 error_check_good client_env [is_valid_env $env2] TRUE 177 error_check_good e1_pfx [$env2 errpfx CLIENT2] 0 178 error_check_good e2_cl [$env2 rep_start -client] 0 179 error_check_good e1_pfx [$env1 errpfx CLIENT1] 0 180 181 # Check for on-disk or in-memory while we have all 3 envs. 182 check_db_location $masterenv 183 check_db_location $env1 184 check_db_location $env2 185 186 error_check_good env1_close [$env1 close] 0 187 188 puts "\tRep$tnum.g: Run test in master again." 189 set start [expr $start + $niter] 190 error_check_good e1_pfx [$env2 errpfx CLIENT2] 0 191 eval rep_test $method $masterenv $masterdb $niter $start 0 0 $largs 192 set envlist "{$env0 1} {$env2 2}" 193 process_msgs $envlist 194 195 puts "\tRep$tnum.h: Closing" 196 error_check_good env0db [$env0db close] 0 197 error_check_good env0_close [$env0 close] 0 198 error_check_good env2_close [$env2 close] 0 199 replclose $testdir/MSGQUEUEDIR 200 set testdir $orig_tdir 201 return 202} 203