1# See the file LICENSE for redistribution information. 2# 3# Copyright (c) 2004-2009 Oracle. All rights reserved. 4# 5# $Id$ 6# 7# TEST rep041 8# TEST Turn replication on and off at run-time. 9# TEST 10# TEST Start a master with replication OFF (noop transport function). 11# TEST Run rep_test to advance log files and archive. 12# TEST Start up client; change master to working transport function. 13# TEST Now replication is ON. 14# TEST Do more ops, make sure client is up to date. 15# TEST Close client, turn replication OFF on master, do more ops. 16# TEST Repeat from point A. 17# 18proc rep041 { method { niter 500 } { tnum "041" } args } { 19 20 source ./include.tcl 21 global databases_in_memory 22 global repfiles_in_memory 23 24 if { $is_windows9x_test == 1 } { 25 puts "Skipping replication test on Win 9x platform." 26 return 27 } 28 29 # Valid for all access methods. 30 if { $checking_valid_methods } { 31 return "ALL" 32 } 33 34 set args [convert_args $method $args] 35 set saved_args $args 36 37 set logsets [create_logsets 2] 38 39 # This test needs to set its own pagesize. 40 set pgindex [lsearch -exact $args "-pagesize"] 41 if { $pgindex != -1 } { 42 puts "Rep$tnum: skipping for specific pagesizes" 43 return 44 } 45 46 # Set up for on-disk or in-memory databases. 47 set msg "using on-disk databases" 48 if { $databases_in_memory } { 49 set msg "using named in-memory databases" 50 if { [is_queueext $method] } { 51 puts -nonewline "Skipping rep$tnum for method " 52 puts "$method with named in-memory databases." 53 return 54 } 55 } 56 57 set msg2 "and on-disk replication files" 58 if { $repfiles_in_memory } { 59 set msg2 "and in-memory replication files" 60 } 61 62 # Run the body of the test with and without recovery, 63 # and with and without cleaning. Skip recovery with in-memory 64 # logging - it doesn't make sense. 65 foreach r $test_recopts { 66 foreach l $logsets { 67 set logindex [lsearch -exact $l "in-memory"] 68 if { $r == "-recover" && $logindex != -1 } { 69 puts "Skipping rep$tnum for -recover\ 70 with in-memory logs." 71 continue 72 } 73 74 set envargs "" 75 set args $saved_args 76 puts "Rep$tnum ($method $envargs $r $args):\ 77 Turn replication on and off, $msg $msg2." 78 puts "Rep$tnum: Master logs are [lindex $l 0]" 79 puts "Rep$tnum: Client logs are [lindex $l 1]" 80 rep041_sub $method $niter $tnum $envargs \ 81 $l $r $args 82 } 83 } 84} 85 86proc rep041_sub { method niter tnum envargs logset recargs largs } { 87 global testdir 88 global util_path 89 global databases_in_memory 90 global repfiles_in_memory 91 global rep_verbose 92 global verbose_type 93 94 set verbargs "" 95 if { $rep_verbose == 1 } { 96 set verbargs " -verbose {$verbose_type on} " 97 } 98 99 set repmemargs "" 100 if { $repfiles_in_memory } { 101 set repmemargs "-rep_inmem_files " 102 } 103 104 env_cleanup $testdir 105 106 replsetup $testdir/MSGQUEUEDIR 107 108 set masterdir $testdir/MASTERDIR 109 set clientdir $testdir/CLIENTDIR 110 111 file mkdir $masterdir 112 file mkdir $clientdir 113 114 # Log size is small so we quickly create more than one. 115 # The documentation says that the log file must be at least 116 # four times the size of the in-memory log buffer. 117 set pagesize 4096 118 append largs " -pagesize $pagesize " 119 set log_max [expr $pagesize * 8] 120 121 set m_logtype [lindex $logset 0] 122 set c_logtype [lindex $logset 1] 123 124 # In-memory logs cannot be used with -txn nosync. 125 set m_logargs [adjust_logargs $m_logtype] 126 set c_logargs [adjust_logargs $c_logtype] 127 set m_txnargs [adjust_txnargs $m_logtype] 128 set c_txnargs [adjust_txnargs $c_logtype] 129 130 # Open a master. 131 puts "\tRep$tnum.a: Open master with replication OFF." 132 repladd 1 133 set ma_envcmd "berkdb_env_noerr -create $m_txnargs $verbargs \ 134 $m_logargs -log_max $log_max $envargs -errpfx MASTER \ 135 $repmemargs -home $masterdir -rep" 136 set masterenv [eval $ma_envcmd $recargs] 137 $masterenv rep_limit 0 0 138 139 # Run rep_test in the master to advance log files. 140 puts "\tRep$tnum.b: Running rep_test to create some log files." 141 set start 0 142 eval rep_test $method $masterenv NULL $niter $start $start 0 $largs 143 incr start $niter 144 145 # Reset transport function to replnoop, and specify that 146 # this env will be master. 147 error_check_good \ 148 transport_noop [$masterenv rep_transport {1 replnoop}] 0 149 error_check_good rep_on [$masterenv rep_start -master] 0 150 151 # If master is on-disk, archive. 152 if { $m_logtype != "in-memory" } { 153 puts "\tRep$tnum.c: Run log_archive - some logs should be removed." 154 set res [eval exec $util_path/db_archive -l -h $masterdir] 155 error_check_bad log.1.present [lsearch -exact $res log.0000000001] -1 156 set res [eval exec $util_path/db_archive -d -h $masterdir] 157 set res [eval exec $util_path/db_archive -l -h $masterdir] 158 error_check_good log.1.gone [lsearch -exact $res log.0000000001] -1 159 } 160 161 # Run rep_test some more - this simulates running without clients. 162 puts "\tRep$tnum.d: Running rep_test." 163 eval rep_test $method $masterenv NULL $niter $start $start 0 $largs 164 incr start $niter 165 166 # Open a client 167 puts "\tRep$tnum.e: Open client." 168 repladd 2 169 set cl_envcmd "berkdb_env_noerr -create $c_txnargs $verbargs \ 170 $c_logargs -log_max $log_max $envargs -errpfx CLIENT \ 171 $repmemargs -home $clientdir \ 172 -rep_transport \[list 2 replsend\]" 173 set clientenv [eval $cl_envcmd $recargs -rep_client] 174 $clientenv rep_limit 0 0 175 $clientenv rep_request 4000 128000 176 177 # Set up envlist for processing messages later. 178 set envlist "{$masterenv 1} {$clientenv 2}" 179 180 # Turn replication on and off more than once. 181 set repeats 2 182 for { set i 0 } { $i < $repeats } { incr i } { 183 184 puts "\tRep$tnum.f.$i: Turn replication ON." 185 # Reset master transport function to replsend. 186 error_check_good transport_on \ 187 [$masterenv rep_transport {1 replsend}] 0 188 189 # Have the master announce itself so messages will pass. 190 error_check_good rep_on [$masterenv rep_start -master] 0 191 192 # Create some new messages, and process them. 193 set nentries 50 194 eval rep_test \ 195 $method $masterenv NULL $nentries $start $start 0 $largs 196 incr start $nentries 197 process_msgs $envlist 198 199 puts "\tRep$tnum.g.$i: Verify that client is up to date." 200 201 # Check that master and client contents match, to verify 202 # that client is up to date. 203 rep_verify $masterdir $masterenv $clientdir $clientenv 0 1 0 204 205 # Process messages again -- the rep_verify created some. 206 process_msgs $envlist 207 208 puts "\tRep$tnum.h.$i: Turn replication OFF on master." 209 error_check_good \ 210 transport_off [$masterenv rep_transport {1 replnoop}] 0 211 212 puts "\tRep$tnum.i.$i: Running rep_test in replicated env." 213 eval rep_test \ 214 $method $masterenv NULL $niter $start $start 0 $largs 215 incr start $niter 216 217 puts "\tRep$tnum.j.$i:\ 218 Process messages; none should be available." 219 set nproced [proc_msgs_once $envlist NONE err] 220 error_check_good no_messages $nproced 0 221 222 # Client and master should NOT match. 223 puts "\tRep$tnum.k.$i: Master and client should NOT match." 224 rep_verify $masterdir $masterenv $clientdir $clientenv 0 0 0 225 226 } 227 228 error_check_good clientenv_close [$clientenv close] 0 229 error_check_good masterenv_close [$masterenv close] 0 230 replclose $testdir/MSGQUEUEDIR 231} 232