1# See the file LICENSE for redistribution information. 2# 3# Copyright (c) 2001,2008 Oracle. All rights reserved. 4# 5# $Id: rep048.tcl,v 12.16 2008/01/08 20:58:53 bostic Exp $ 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 17 if { $checking_valid_methods } { 18 return "ALL" 19 } 20 21 set args [convert_args $method $args] 22 set logsets [create_logsets 2] 23 24 # Run the body of the test with and without recovery. 25 foreach r $test_recopts { 26 foreach l $logsets { 27 set logindex [lsearch -exact $l "in-memory"] 28 if { $r == "-recover" && $logindex != -1 } { 29 puts "Skipping test with -recover for \ 30 in-memory logs." 31 continue 32 } 33 puts "Rep$tnum ($method $r):\ 34 Replication and toggling bulk transfer." 35 puts "Rep$tnum: Master logs are [lindex $l 0]" 36 puts "Rep$tnum: Client logs are [lindex $l 1]" 37 rep048_sub $method $nentries $tnum $l $r $args 38 } 39 } 40} 41 42proc rep048_sub { method niter tnum logset recargs largs } { 43 source ./include.tcl 44 global overflowword1 45 global overflowword2 46 global rep_verbose 47 global verbose_type 48 49 set verbargs "" 50 if { $rep_verbose == 1 } { 51 set verbargs " -verbose {$verbose_type on} " 52 } 53 54 set orig_tdir $testdir 55 env_cleanup $testdir 56 57 replsetup $testdir/MSGQUEUEDIR 58 set overflowword1 "0" 59 set overflowword2 "0" 60 61 set masterdir $testdir/MASTERDIR 62 set clientdir $testdir/CLIENTDIR 63 file mkdir $clientdir 64 file mkdir $masterdir 65 66 set m_logtype [lindex $logset 0] 67 set c_logtype [lindex $logset 1] 68 69 set in_memory_log \ 70 [expr { $m_logtype == "in-memory" || $c_logtype == "in-memory" }] 71 72 # In-memory logs require a large log buffer, and can not 73 # be used with -txn nosync. Adjust the args for master 74 # and client. 75 # This test has a long transaction, allocate a larger log 76 # buffer for in-memory test. 77 set m_logargs [adjust_logargs $m_logtype [expr 20 * 1024 * 1024]] 78 set c_logargs [adjust_logargs $c_logtype [expr 20 * 1024 * 1024]] 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 -errpfx MASTER $verbargs -home $masterdir \ 86 -rep_master -rep_transport \[list 1 replsend\]" 87 set masterenv [eval $ma_envcmd $recargs] 88 error_check_good master_env [is_valid_env $masterenv] TRUE 89 90 # Open a client. 91 repladd 2 92 set cl_envcmd "berkdb_env_noerr -create $c_txnargs $c_logargs \ 93 -errpfx CLIENT $verbargs -home $clientdir \ 94 -rep_client -rep_transport \[list 2 replsend\]" 95 set clientenv [eval $cl_envcmd $recargs] 96 error_check_good client_env [is_valid_env $clientenv] TRUE 97 98 # Bring the client online by processing the startup messages. 99 set envlist "{$masterenv 1} {$clientenv 2}" 100 process_msgs $envlist 101 102 puts "\tRep$tnum.a: Create and open master databases" 103 set testfile "test$tnum.db" 104 set omethod [convert_method $method] 105 set masterdb [eval {berkdb_open_noerr -env $masterenv -auto_commit \ 106 -create -mode 0644} $largs $omethod $testfile] 107 error_check_good dbopen [is_valid_db $masterdb] TRUE 108 109 set scrlog $testdir/repscript.log 110 puts "\tRep$tnum.b: Fork child process." 111 set pid [exec $tclsh_path $test_path/wrap.tcl \ 112 rep048script.tcl $scrlog \ 113 $masterdir &] 114 115 # Wait for child process to start up. 116 while { 1 } { 117 if { [file exists $masterdir/marker.file] == 0 } { 118 tclsleep 1 119 } else { 120 tclsleep 1 121 break 122 } 123 } 124 # Run a modified test001 in the master (and update clients). 125 # Call it several times so make sure that we get descheduled. 126 puts "\tRep$tnum.c: Basic long running txn" 127 set div 10 128 set loop [expr $niter / $div] 129 set start 0 130 for { set i 0 } { $i < $div } {incr i} { 131 rep_test_bulk $method $masterenv $masterdb $loop $start $start 0 132 process_msgs $envlist 133 set start [expr $start + $loop] 134 tclsleep 1 135 } 136 error_check_good dbclose [$masterdb close] 0 137 set marker [open $masterdir/done.file w] 138 close $marker 139 140 set bulkxfer1 [stat_field $masterenv rep_stat "Bulk buffer transfers"] 141 error_check_bad bulk $bulkxfer1 0 142 143 puts "\tRep$tnum.d: Waiting for child ..." 144 # Watch until the child is done. 145 watch_procs $pid 5 146 process_msgs $envlist 147 rep_verify $masterdir $masterenv $clientdir $clientenv \ 148 $in_memory_log 1 1 $testfile 149 rep_verify $masterdir $masterenv $clientdir $clientenv \ 150 0 1 0 "child.db" 151 152 error_check_good mclose [$masterenv close] 0 153 error_check_good cclose [$clientenv close] 0 154 replclose $testdir/MSGQUEUEDIR 155} 156