1# See the file LICENSE for redistribution information. 2# 3# Copyright (c) 2004,2008 Oracle. All rights reserved. 4# 5# $Id: rep030.tcl,v 12.26 2008/01/08 20:58:53 bostic Exp $ 6# 7# TEST rep030 8# TEST Test of internal initialization multiple files and pagesizes. 9# TEST Hold some databases open on master. 10# TEST 11# TEST One master, one client using a data_dir for internal init. 12# TEST Generate several log files. 13# TEST Remove old master log files. 14# TEST Delete client files and restart client. 15# TEST Put one more record to the master. 16# 17proc rep030 { method { niter 500 } { tnum "030" } args } { 18 19 source ./include.tcl 20 if { $is_windows9x_test == 1 } { 21 puts "Skipping replication test on Win 9x platform." 22 return 23 } 24 25 # Valid for all access methods. 26 if { $checking_valid_methods } { 27 return "ALL" 28 } 29 30 set args [convert_args $method $args] 31 32 # This test needs to set its own pagesize. 33 set pgindex [lsearch -exact $args "-pagesize"] 34 if { $pgindex != -1 } { 35 puts "Rep$tnum: skipping for specific pagesizes" 36 return 37 } 38 39 set logsets [create_logsets 2] 40 41 # Run the body of the test with and without recovery, 42 # and with and without cleaning. 43 set opts { clean noclean bulk } 44 foreach r $test_recopts { 45 foreach c $opts { 46 foreach l $logsets { 47 set logindex [lsearch -exact $l "in-memory"] 48 if { $r == "-recover" && $logindex != -1 } { 49 puts "Skipping rep$tnum for -recover\ 50 with in-memory logs." 51 continue 52 } 53 puts "Rep$tnum ($method $r $c):\ 54 Internal initialization - hold some\ 55 databases open on master." 56 puts "Rep$tnum: Master logs are [lindex $l 0]" 57 puts "Rep$tnum: Client logs are [lindex $l 1]" 58 rep030_sub $method $niter $tnum $l $r $c $args 59 } 60 } 61 } 62} 63 64proc rep030_sub { method niter tnum logset recargs opts largs } { 65 global testdir 66 global util_path 67 global rep_verbose 68 global verbose_type 69 70 set verbargs "" 71 if { $rep_verbose == 1 } { 72 set verbargs " -verbose {$verbose_type on} " 73 } 74 75 env_cleanup $testdir 76 77 replsetup $testdir/MSGQUEUEDIR 78 79 set masterdir $testdir/MASTERDIR 80 set clientdir $testdir/CLIENTDIR 81 82 file mkdir $masterdir 83 file mkdir $clientdir 84 85 # Log size is small so we quickly create more than one. 86 # The documentation says that the log file must be at least 87 # four times the size of the in-memory log buffer. 88 set maxpg 16384 89 set log_max [expr $maxpg * 8] 90 set cache [expr $maxpg * 32 ] 91 92 set m_logtype [lindex $logset 0] 93 set c_logtype [lindex $logset 1] 94 95 # In-memory logs cannot be used with -txn nosync. 96 set m_logargs [adjust_logargs $m_logtype] 97 set c_logargs [adjust_logargs $c_logtype] 98 set m_txnargs [adjust_txnargs $m_logtype] 99 set c_txnargs [adjust_txnargs $c_logtype] 100 101 # Open a master. 102 103 # 104 # Run internal init using a data directory 105 # 106 file mkdir $masterdir/data 107 file mkdir $masterdir/data2 108 file mkdir $clientdir/data 109 file mkdir $clientdir/data2 110 # 111 # Set it twice to test duplicates data_dirs as well 112 # as multiple, different data dirs 113 # 114 set data_diropts " -data_dir data -data_dir data -data_dir data2" 115 116 repladd 1 117 set ma_envcmd "berkdb_env_noerr -create $m_txnargs \ 118 $m_logargs -log_max $log_max -errpfx MASTER \ 119 -cachesize { 0 $cache 1 } $data_diropts $verbargs \ 120 -home $masterdir -rep_transport \[list 1 replsend\]" 121 set masterenv [eval $ma_envcmd $recargs -rep_master] 122 123 # Open a client 124 repladd 2 125 set cl_envcmd "berkdb_env_noerr -create $c_txnargs \ 126 $c_logargs -log_max $log_max -errpfx CLIENT \ 127 -cachesize { 0 $cache 1 } $data_diropts $verbargs \ 128 -home $clientdir -rep_transport \[list 2 replsend\]" 129 set clientenv [eval $cl_envcmd $recargs -rep_client] 130 131 # Bring the clients online by processing the startup messages. 132 set envlist "{$masterenv 1} {$clientenv 2}" 133 process_msgs $envlist 134 135 # Clobber replication's 30-second anti-archive timer, which will have 136 # been started by client sync-up internal init, so that we can do a 137 # log_archive in a moment. 138 # 139 $masterenv test force noarchive_timeout 140 141 # Run rep_test in the master (and update client). 142 set startpgsz 512 143 set pglist "" 144 for { set pgsz $startpgsz } { $pgsz <= $maxpg } \ 145 { set pgsz [expr $pgsz * 2] } { 146 lappend pglist $pgsz 147 } 148 set nfiles [llength $pglist] 149 puts "\tRep$tnum.a.0: Running rep_test $nfiles times in replicated env." 150 set dbopen "" 151 for { set i 0 } { $i < $nfiles } { incr i } { 152 set mult [expr $i * 10] 153 set nentries [expr $niter + $mult] 154 set pagesize [lindex $pglist $i] 155 set largs " -pagesize $pagesize " 156 eval rep_test $method $masterenv NULL $nentries $mult $mult \ 157 0 0 $largs 158 process_msgs $envlist 159 160 # 161 # Everytime we run 'rep_test' we create 'test.db'. So 162 # rename it each time through the loop. 163 # 164 set old "test.db" 165 set new "test.$i.db" 166 error_check_good rename [$masterenv dbrename \ 167 -auto_commit $old $new] 0 168 process_msgs $envlist 169 # 170 # We want to keep some databases open so that we test the 171 # code finding the files in the data dir as well as finding 172 # them in dbreg list. 173 # 174 if { [expr $i % 2 ] == 0 } { 175 set db [berkdb_open_noerr -env $masterenv $new] 176 error_check_good dbopen.$i [is_valid_db $db] TRUE 177 lappend dbopen $db 178 } 179 } 180 # 181 # Set up a few special databases too. We want one with a subdatabase 182 # and we want an empty database. 183 # 184 set testfile "test.db" 185 if { [is_queue $method] } { 186 set sub "" 187 } else { 188 set sub "subdb" 189 } 190 set omethod [convert_method $method] 191 set largs " -pagesize $maxpg " 192 set largs [convert_args $method $largs] 193 set emptyfile "empty.db" 194 # 195 # Create/close an empty database. 196 # 197 set db [eval {berkdb_open_noerr -env $masterenv -auto_commit -create \ 198 -mode 0644} $largs $omethod $emptyfile] 199 error_check_good emptydb [is_valid_db $db] TRUE 200 error_check_good empty_close [$db close] 0 201 # 202 # Keep this subdb (regular if queue) database open. 203 # We need it a few times later on. 204 # 205 set db [eval {berkdb_open_noerr -env $masterenv -auto_commit -create \ 206 -mode 0644} $largs $omethod $testfile $sub] 207 error_check_good subdb [is_valid_db $db] TRUE 208 set start 0 209 eval rep_test $method $masterenv $db $niter $start $start 0 0 $largs 210 incr start $niter 211 process_msgs $envlist 212 213 puts "\tRep$tnum.b: Close client." 214 # First save the log number of the latest client log. 215 set last_client_log [get_logfile $clientenv last] 216 error_check_good client_close [$clientenv close] 0 217 218 # Run rep_test in the master (don't update client). 219 set stop 0 220 while { $stop == 0 } { 221 # Run rep_test in the master (don't update client). 222 puts "\tRep$tnum.c: Running rep_test in replicated env." 223 eval rep_test \ 224 $method $masterenv $db $niter $start $start 0 0 $largs 225 incr start $niter 226 replclear 2 227 228 puts "\tRep$tnum.d: Run db_archive on master." 229 if { $m_logtype != "in-memory"} { 230 set res [eval exec $util_path/db_archive -d -h $masterdir] 231 set res [eval exec $util_path/db_archive -l -h $masterdir] 232 } 233 set first_master_log [get_logfile $masterenv first] 234 if { $first_master_log > $last_client_log } { 235 set stop 1 236 } 237 } 238 239 puts "\tRep$tnum.e: Reopen client ($opts)." 240 if { $opts == "clean" } { 241 env_cleanup $clientdir 242 file mkdir $clientdir/data 243 file mkdir $clientdir/data2 244 } 245 if { $opts == "bulk" } { 246 error_check_good bulk [$masterenv rep_config {bulk on}] 0 247 } 248 249 set clientenv [eval $cl_envcmd $recargs -rep_client] 250 error_check_good client_env [is_valid_env $clientenv] TRUE 251 set envlist "{$masterenv 1} {$clientenv 2}" 252 process_msgs $envlist 0 NONE err 253 if { $opts != "clean" } { 254 puts "\tRep$tnum.e.1: Trigger log request" 255 # 256 # When we don't clean, starting the client doesn't 257 # trigger any events. We need to generate some log 258 # records so that the client requests the missing 259 # logs and that will trigger it. 260 # 261 set entries 100 262 eval rep_test $method $masterenv $db $entries $start $start 0 0 $largs 263 incr start $entries 264 process_msgs $envlist 0 NONE err 265 } 266 error_check_good subdb_close [$db close] 0 267 process_msgs $envlist 0 NONE err 268 269 puts "\tRep$tnum.f: Verify logs and databases" 270 # 271 # If doing bulk testing, turn it off now so that it forces us 272 # to flush anything currently in the bulk buffer. We need to 273 # do this because rep_test might have aborted a transaction on 274 # its last iteration and those log records would still be in 275 # the bulk buffer causing the log comparison to fail. 276 # 277 if { $opts == "bulk" } { 278 puts "\tRep$tnum.f.1: Turn off bulk transfers." 279 error_check_good bulk [$masterenv rep_config {bulk off}] 0 280 process_msgs $envlist 0 NONE err 281 } 282 rep_verify $masterdir $masterenv $clientdir $clientenv 1 283 for { set i 0 } { $i < $nfiles } { incr i } { 284 set dbname "test.$i.db" 285 rep_verify $masterdir $masterenv $clientdir $clientenv \ 286 1 1 0 $dbname 287 } 288 289 # Close the database held open on master for initialization. 290 foreach db $dbopen { 291 error_check_good db_close [$db close] 0 292 } 293 294 # Add records to the master and update client. 295 puts "\tRep$tnum.g: Add more records and check again." 296 set entries 10 297 set db [eval {berkdb_open_noerr -env $masterenv -auto_commit \ 298 -mode 0644} $largs $omethod $testfile $sub] 299 error_check_good subdb [is_valid_db $db] TRUE 300 eval rep_test $method $masterenv $db $entries $niter 0 0 0 $largs 301 error_check_good subdb_close [$db close] 0 302 process_msgs $envlist 0 NONE err 303 304 rep_verify $masterdir $masterenv $clientdir $clientenv 1 1 0 305 for { set i 0 } { $i < $nfiles } { incr i } { 306 set dbname "test.$i.db" 307 rep_verify $masterdir $masterenv $clientdir $clientenv \ 308 1 1 0 $dbname 309 } 310 set bulkxfer [stat_field $masterenv rep_stat "Bulk buffer transfers"] 311 if { $opts == "bulk" } { 312 error_check_bad bulkxferon $bulkxfer 0 313 } else { 314 error_check_good bulkxferoff $bulkxfer 0 315 } 316 317 check_log_location $masterenv 318 check_log_location $clientenv 319 320 error_check_good masterenv_close [$masterenv close] 0 321 error_check_good clientenv_close [$clientenv close] 0 322 replclose $testdir/MSGQUEUEDIR 323} 324