1# See the file LICENSE for redistribution information. 2# 3# Copyright (c) 2001-2009 Oracle. All rights reserved. 4# 5# $Id$ 6# 7# TEST rep048 8# TEST Replication and log gap bulk transfers. 9# TEST Have two master env handles. Turn bulk on in 10# TEST one (turns it on for both). Turn it off in the other. 11# TEST While toggling, send log records from both handles. 12# TEST Process message and verify master and client match. 13# 14proc rep048 { method { nentries 3000 } { tnum "048" } args } { 15 source ./include.tcl 16 global databases_in_memory 17 global repfiles_in_memory 18 19 if { $checking_valid_methods } { 20 return "ALL" 21 } 22 23 set args [convert_args $method $args] 24 set logsets [create_logsets 2] 25 26 # Set up for on-disk or in-memory databases. 27 set msg "using on-disk databases" 28 if { $databases_in_memory } { 29 set msg "using named in-memory databases" 30 if { [is_queueext $method] } { 31 puts -nonewline "Skipping rep$tnum for method " 32 puts "$method with named in-memory databases." 33 return 34 } 35 } 36 37 set msg2 "and on-disk replication files" 38 if { $repfiles_in_memory } { 39 set msg2 "and in-memory replication files" 40 } 41 42 # Run the body of the test with and without recovery. 43 foreach r $test_recopts { 44 foreach l $logsets { 45 set logindex [lsearch -exact $l "in-memory"] 46 if { $r == "-recover" && $logindex != -1 } { 47 puts "Skipping test with -recover for \ 48 in-memory logs." 49 continue 50 } 51 puts "Rep$tnum ($method $r): Replication\ 52 and toggling bulk transfer $msg $msg2." 53 puts "Rep$tnum: Master logs are [lindex $l 0]" 54 puts "Rep$tnum: Client logs are [lindex $l 1]" 55 rep048_sub $method $nentries $tnum $l $r $args 56 } 57 } 58} 59 60proc rep048_sub { method niter tnum logset recargs largs } { 61 source ./include.tcl 62 global overflowword1 63 global overflowword2 64 global databases_in_memory 65 global repfiles_in_memory 66 global rep_verbose 67 global verbose_type 68 69 set verbargs "" 70 if { $rep_verbose == 1 } { 71 set verbargs " -verbose {$verbose_type on} " 72 } 73 74 set repmemargs "" 75 if { $repfiles_in_memory } { 76 set repmemargs "-rep_inmem_files " 77 } 78 79 set orig_tdir $testdir 80 env_cleanup $testdir 81 82 replsetup $testdir/MSGQUEUEDIR 83 set overflowword1 "0" 84 set overflowword2 "0" 85 86 set masterdir $testdir/MASTERDIR 87 set clientdir $testdir/CLIENTDIR 88 file mkdir $clientdir 89 file mkdir $masterdir 90 91 set m_logtype [lindex $logset 0] 92 set c_logtype [lindex $logset 1] 93 94 set in_memory_log \ 95 [expr { $m_logtype == "in-memory" || $c_logtype == "in-memory" }] 96 97 # In-memory logs require a large log buffer, and can not 98 # be used with -txn nosync. Adjust the args for master 99 # and client. 100 # This test has a long transaction, allocate a larger log 101 # buffer for in-memory test. 102 set m_logargs [adjust_logargs $m_logtype [expr 20 * 1024 * 1024]] 103 set c_logargs [adjust_logargs $c_logtype [expr 20 * 1024 * 1024]] 104 set m_txnargs [adjust_txnargs $m_logtype] 105 set c_txnargs [adjust_txnargs $c_logtype] 106 107 # Open a master. 108 repladd 1 109 set ma_envcmd "berkdb_env_noerr -create $m_txnargs $m_logargs \ 110 -errpfx MASTER $verbargs -home $masterdir $repmemargs \ 111 -rep_master -rep_transport \[list 1 replsend\]" 112 set masterenv [eval $ma_envcmd $recargs] 113 error_check_good master_env [is_valid_env $masterenv] TRUE 114 115 # Open a client. 116 repladd 2 117 set cl_envcmd "berkdb_env_noerr -create $c_txnargs $c_logargs \ 118 -errpfx CLIENT $verbargs -home $clientdir $repmemargs \ 119 -rep_client -rep_transport \[list 2 replsend\]" 120 set clientenv [eval $cl_envcmd $recargs] 121 error_check_good client_env [is_valid_env $clientenv] TRUE 122 123 # Bring the client online by processing the startup messages. 124 set envlist "{$masterenv 1} {$clientenv 2}" 125 process_msgs $envlist 126 127 puts "\tRep$tnum.a: Create and open master databases" 128 if { $databases_in_memory } { 129 set dbname { "" "test.db" } 130 } else { 131 set dbname "test.db" 132 } 133 134 set omethod [convert_method $method] 135 set masterdb [eval {berkdb_open_noerr -env $masterenv -auto_commit \ 136 -create -mode 0644} $largs $omethod $dbname] 137 error_check_good dbopen [is_valid_db $masterdb] TRUE 138 139 set scrlog $testdir/repscript.log 140 puts "\tRep$tnum.b: Fork child process." 141 set pid [exec $tclsh_path $test_path/wrap.tcl \ 142 rep048script.tcl $scrlog $masterdir $databases_in_memory &] 143 144 # Wait for child process to start up. 145 while { 1 } { 146 if { [file exists $masterdir/marker.file] == 0 } { 147 tclsleep 1 148 } else { 149 tclsleep 1 150 break 151 } 152 } 153 # Run a modified test001 in the master (and update clients). 154 # Call it several times so make sure that we get descheduled. 155 puts "\tRep$tnum.c: Basic long running txn" 156 set div 10 157 set loop [expr $niter / $div] 158 set start 0 159 for { set i 0 } { $i < $div } {incr i} { 160 rep_test_bulk $method $masterenv $masterdb $loop $start $start 0 161 process_msgs $envlist 162 set start [expr $start + $loop] 163 tclsleep 1 164 } 165 error_check_good dbclose [$masterdb close] 0 166 set marker [open $masterdir/done.file w] 167 close $marker 168 169 set bulkxfer1 [stat_field $masterenv rep_stat "Bulk buffer transfers"] 170 error_check_bad bulk $bulkxfer1 0 171 172 puts "\tRep$tnum.d: Waiting for child ..." 173 # Watch until the child is done. 174 watch_procs $pid 5 175 process_msgs $envlist 176 set childname "child.db" 177 178 rep_verify $masterdir $masterenv $clientdir $clientenv \ 179 $in_memory_log 1 1 180 rep_verify $masterdir $masterenv $clientdir $clientenv \ 181 0 1 0 $childname 182 183 error_check_good mclose [$masterenv close] 0 184 error_check_good cclose [$clientenv close] 0 185 replclose $testdir/MSGQUEUEDIR 186} 187