diff options
author | Anas Nashif <anas.nashif@intel.com> | 2012-10-30 16:00:08 -0700 |
---|---|---|
committer | Anas Nashif <anas.nashif@intel.com> | 2012-10-30 16:00:08 -0700 |
commit | 7edf6e8ac0df452d4af7a15da08609821b0b3c0f (patch) | |
tree | 1cf0f01d9b6574972173e3cd40b62e4ebeaaaaae /test/rep079.tcl | |
download | db4-7edf6e8ac0df452d4af7a15da08609821b0b3c0f.tar.gz db4-7edf6e8ac0df452d4af7a15da08609821b0b3c0f.tar.bz2 db4-7edf6e8ac0df452d4af7a15da08609821b0b3c0f.zip |
Imported Upstream version 4.8.30.NCupstream/4.8.30.NC
Diffstat (limited to 'test/rep079.tcl')
-rw-r--r-- | test/rep079.tcl | 329 |
1 files changed, 329 insertions, 0 deletions
diff --git a/test/rep079.tcl b/test/rep079.tcl new file mode 100644 index 00000000..24a533cc --- /dev/null +++ b/test/rep079.tcl @@ -0,0 +1,329 @@ +# See the file LICENSE for redistribution information. +# +# Copyright (c) 2001-2009 Oracle. All rights reserved. +# +# $Id$ +# +# TEST rep079 +# TEST Replication leases and invalid usage. +# TEST +# TEST Open a client without leases. Attempt to set leases after rep_start. +# TEST Attempt to declare as master without election. +# TEST Run an election with an nsites parameter value. +# TEST Elect a master with leases. Put some data and send to clients. +# TEST Cleanly shutdown master env. Restart without +# TEST recovery and verify leases are expired and refreshed. +# TEST Add a new client without leases to a group using leases. +# +proc rep079 { method { tnum "079" } args } { + source ./include.tcl + global repfiles_in_memory + + if { $is_windows9x_test == 1 } { + puts "Skipping replication test on Win9x platform." + return + } + + # Valid for all access methods, but there is no difference + # running it with one method over any other. Just use btree. + if { $checking_valid_methods } { + set test_methods { btree } + return $test_methods + } + if { [is_btree $method] == 0 } { + puts "Rep$tnum: Skipping for method $method." + return + } + + set args [convert_args $method $args] + set logsets [create_logsets 4] + + set msg2 "and on-disk replication files" + if { $repfiles_in_memory } { + set msg2 "and in-memory replication files" + } + + foreach l $logsets { + # + # Skip the case where the master is in-memory and at least + # one of the clients is on-disk. If the master is in-memory, + # the wrong site gets elected because on-disk envs write a log + # record when they create the env and in-memory ones do not + # and the test wants to control which env gets elected. + # + set master_logs [lindex $l 0] + if { $master_logs == "in-memory" } { + set client_logs [lsearch -exact $l "on-disk"] + if { $client_logs != -1 } { + puts "Skipping for in-memory master\ + with on-disk client." + continue + } + } + puts "Rep$tnum: Replication leases and invalid usage $msg2." + puts "Rep$tnum: Master logs are [lindex $l 0]" + puts "Rep$tnum: Client logs are [lindex $l 1]" + puts "Rep$tnum: Client 2 logs are [lindex $l 2]" + puts "Rep$tnum: Client 3 logs are [lindex $l 3]" + rep079_sub $method $tnum $l $args + } +} + +proc rep079_sub { method tnum logset largs } { + global testdir + global repfiles_in_memory + global rep_verbose + global verbose_type + + set verbargs "" + if { $rep_verbose == 1 } { + set verbargs " -verbose {$verbose_type on} " + } + + set repmemargs "" + if { $repfiles_in_memory } { + set repmemargs "-rep_inmem_files " + } + + env_cleanup $testdir + + set qdir $testdir/MSGQUEUEDIR + replsetup $qdir + + set masterdir $testdir/MASTERDIR + set clientdir $testdir/CLIENTDIR + set clientdir2 $testdir/CLIENTDIR2 + set clientdir3 $testdir/CLIENTDIR3 + + file mkdir $masterdir + file mkdir $clientdir + file mkdir $clientdir2 + file mkdir $clientdir3 + + set m_logtype [lindex $logset 0] + set c_logtype [lindex $logset 1] + set c2_logtype [lindex $logset 2] + set c3_logtype [lindex $logset 3] + + # In-memory logs cannot be used with -txn nosync. + set m_logargs [adjust_logargs $m_logtype] + set c_logargs [adjust_logargs $c_logtype] + set c2_logargs [adjust_logargs $c2_logtype] + set c3_logargs [adjust_logargs $c3_logtype] + set m_txnargs [adjust_txnargs $m_logtype] + set c_txnargs [adjust_txnargs $c_logtype] + set c2_txnargs [adjust_txnargs $c2_logtype] + set c3_txnargs [adjust_txnargs $c3_logtype] + + # Set leases for 4 sites, 1 second timeout, 1% clock skew + # [NOTE: We are not adding in client3 until later so don't + # set it in nvotes.] + set nsites 4 + set nvotes 3 + set lease_to 1000000 + set lease_tosec [expr $lease_to / 1000000] + set clock_fast 101 + set clock_slow 100 + + repladd 2 + # + # Use a command without setting errpfx, errfile or verbose + # so that error messages can be caught correctly. + # + set envcmd_err "berkdb_env_noerr -create $m_txnargs $m_logargs \ + $repmemargs -home $masterdir -rep_transport \[list 2 replsend\]" + + # + # This is the real env command, but we won't use it + # quite yet. + set envcmd(0) "berkdb_env -create $m_txnargs $m_logargs \ + $repmemargs $verbargs -errpfx MASTER -home $masterdir \ + -event rep_event \ + -rep_transport \[list 2 replsend\]" + + # + # Leases must be configured before rep_start is called. + # Open a repl env without leases. Try to configure leases + # after the open has already called rep_start. Open as a client. + # + puts "\tRep$tnum.a: Try to configure leases after rep_start." + set noleaseenv [eval $envcmd_err -rep_client] + set stat [catch {$noleaseenv rep_lease \ + [list $nsites $lease_to $clock_fast $clock_slow]} lease] + error_check_bad stat $stat 0 + error_check_good menverror [is_substr $lease "timeout must be set"] 1 + error_check_good close [$noleaseenv close] 0 + env_cleanup $masterdir + + # + # If leases are being used, elections must be used. A site + # cannot simply upgrade itself to master. Test that we cannot + # open as a client and then upgrade ourself to a master just + # by calling rep_start. + # + set upgenv [eval $envcmd_err -rep_client \ + -rep_lease \[list $nsites $lease_to $clock_fast $clock_slow\]] + puts "\tRep$tnum.b: Try to upgrade a client without election." + set stat [catch {$upgenv rep_start -master} ret] + error_check_bad upg_stat $stat 0 + error_check_good upg_str [is_substr $ret "Cannot become master"] 1 + error_check_good close [$upgenv close] 0 + env_cleanup $masterdir + + # + # Now test inconsistencies dealing with having a group that + # is using lease up and running. For instance, if leases are + # configured, the 'nsites' arg to rep_elect must be 0, etc. + # + # Open the master. Must open as a client and get elected. + # + set err_cmd(0) "none" + set crash(0) 0 + set pri(0) 100 + set masterenv [eval $envcmd(0) -rep_client \ + -rep_lease \[list $nsites $lease_to $clock_fast $clock_slow\]] + error_check_good master_env [is_valid_env $masterenv] TRUE + + # Open two clients. + repladd 3 + set err_cmd(1) "none" + set crash(1) 0 + set pri(1) 10 + set envcmd(1) "berkdb_env -create $c_txnargs $c_logargs \ + $repmemargs $verbargs -errpfx CLIENT -home $clientdir \ + -event rep_event \ + -rep_lease \[list $nsites $lease_to $clock_fast $clock_slow\] \ + -rep_client -rep_transport \[list 3 replsend\]" + set clientenv [eval $envcmd(1)] + error_check_good client_env [is_valid_env $clientenv] TRUE + + repladd 4 + set err_cmd(2) "none" + set crash(2) 0 + set pri(2) 10 + set envcmd(2) "berkdb_env_noerr -create $c2_txnargs $c2_logargs \ + $repmemargs -home $clientdir2 -event rep_event \ + -rep_lease \[list $nsites $lease_to $clock_fast $clock_slow\] \ + -rep_client -rep_transport \[list 4 replsend\]" + set clientenv2 [eval $envcmd(2)] + error_check_good client_env [is_valid_env $clientenv2] TRUE + + # Bring the clients online by processing the startup messages. + set envlist "{$masterenv 2} {$clientenv 3} {$clientenv2 4}" + process_msgs $envlist + + # + # Send a non-zero nsites value for an election. That is an error. + # + puts "\tRep$tnum.c: Try to run election with leases and nsites value." + # + # !!! We have not set -errpfx or -errfile in envcmd(2) above + # otherwise the error output won't be set in 'ret' below and + # the test will fail. Set it after this piece of the test. + # + set timeout 5000000 + set res [catch {$clientenv2 rep_elect $nsites $nvotes $pri(2) \ + $timeout} ret] + error_check_bad catch $res 0 + error_check_good ret [is_substr $ret "nsites must be zero"] 1 + + # + # Now we can set verbose args, errpfx, etc. Set it in the + # command (for elections) and also manually add it to the + # current env handle. + # + set envcmd(2) "$envcmd(2) $verbargs -errpfx CLIENT2" + if { $rep_verbose == 1 } { + $clientenv2 verbose $verbose_type on + $clientenv2 errpfx CLIENT2 + } + + # + # This next section will test that a replicated env that is master + # can cleanly close and then reopen without recovery and retain + # its master status. + # + set msg "Rep$tnum.d" + set nvotes [expr $nsites - 1] + set winner 0 + setpriority pri $nsites $winner + set elector [berkdb random_int 0 2] + puts "\tRep$tnum.d: Run election for real to get master." + # + # Run election for real. Set nsites to 0 for this command. + # + repladd 5 + set err_cmd(3) "none" + set crash(3) 0 + set pri(3) 0 + run_election envcmd envlist err_cmd pri crash $qdir $msg \ + $elector 0 $nvotes $nsites $winner 0 NULL + + puts "\tRep$tnum.e: Write a checkpoint." + # + # Writing a checkpoint forces a PERM record which will cause + # the clients to grant us their leases. Then, while holding + # the lease grants we can do the next part of the test to + # close and cleanly reopen while holding leases. + $masterenv txn_checkpoint -force + + process_msgs $envlist + + puts "\tRep$tnum.f.0: Close master env." + error_check_good mclose [$masterenv close] 0 + set sleep [expr $lease_tosec + 1] + puts "\tRep$tnum.f.1: Sleep $sleep secs to expire lease grants." + tclsleep $sleep + # + # We should be able to reopen the master env without running + # recovery and still retain our mastership. + set masterenv [eval $envcmd(0) -rep_master \ + -rep_lease \[list $nsites $lease_to $clock_fast $clock_slow\]] + error_check_good master_env [is_valid_env $masterenv] TRUE + set envlist "{$masterenv 2} {$clientenv 3} {$clientenv2 4}" + + # + # Verify that if a non-lease site tries to join a group that + # is using leases, it gets an error. Configuring leases + # must be all-or-none across all group members. + # + puts "\tRep$tnum.g: Add client3 that does not configure leases." + replclear 5 + set envcmd(3) "berkdb_env_noerr -create $c3_txnargs $c3_logargs \ + -home $clientdir3 -event rep_event \ + $repmemargs $verbargs -errpfx CLIENT3 \ + -rep_client -rep_transport \[list 5 replsend\]" + set clientenv3 [eval $envcmd(3)] + error_check_good client_env [is_valid_env $clientenv3] TRUE + + # Bring the clients online by processing the startup messages. + set origlist $envlist + set envlist "{$masterenv 2} {$clientenv 3} \ + {$clientenv2 4} {$clientenv3 5}" + process_msgs $envlist 0 NONE err + + puts "\tRep$tnum.g.1: Verify client fatal error." + error_check_good process_msgs_err [is_substr $err DB_RUNRECOVERY] 1 + # + # Close to reclaim Tcl resources, but we want to catch/ignore + # the continuing DB_RUNRECOVERY error. + # + catch {$clientenv3 close} ret + set envlist $origlist + + puts "\tRep$tnum.h: Check expired lease error on txn commit." + # + # Leases are already expired, so attempt to commit should fail. + # (And this will be the 'before we commit' check that returns + # an error, not the 'after' check that panics). + # + set txn [$masterenv txn] + set stat [catch {$txn commit} ret] + error_check_good stat $stat 1 + error_check_good exp [is_substr $ret REP_LEASE_EXPIRED] 1 + + error_check_good mclose [$masterenv close] 0 + error_check_good cclose [$clientenv close] 0 + error_check_good c2close [$clientenv2 close] 0 + replclose $testdir/MSGQUEUEDIR +} |