diff options
Diffstat (limited to 'bdb/test/recd001.tcl')
-rw-r--r-- | bdb/test/recd001.tcl | 104 |
1 files changed, 83 insertions, 21 deletions
diff --git a/bdb/test/recd001.tcl b/bdb/test/recd001.tcl index bbf5159011b..bc7ac6d896a 100644 --- a/bdb/test/recd001.tcl +++ b/bdb/test/recd001.tcl @@ -1,19 +1,27 @@ # See the file LICENSE for redistribution information. # -# Copyright (c) 1996, 1997, 1998, 1999, 2000 +# Copyright (c) 1996-2002 # Sleepycat Software. All rights reserved. # -# $Id: recd001.tcl,v 11.28 2000/12/07 19:13:46 sue Exp $ +# $Id: recd001.tcl,v 11.40 2002/05/08 19:36:18 sandstro Exp $ # -# Recovery Test 1. -# These are the most basic recovery tests. We do individual recovery -# tests for each operation in the access method interface. First we -# create a file and capture the state of the database (i.e., we copy -# it. Then we run a transaction containing a single operation. In -# one test, we abort the transaction and compare the outcome to the -# original copy of the file. In the second test, we restore the -# original copy of the database and then run recovery and compare -# this against the actual database. +# TEST recd001 +# TEST Per-operation recovery tests for non-duplicate, non-split +# TEST messages. Makes sure that we exercise redo, undo, and do-nothing +# TEST condition. Any test that appears with the message (change state) +# TEST indicates that we've already run the particular test, but we are +# TEST running it again so that we can change the state of the data base +# TEST to prepare for the next test (this applies to all other recovery +# TEST tests as well). +# TEST +# TEST These are the most basic recovery tests. We do individual recovery +# TEST tests for each operation in the access method interface. First we +# TEST create a file and capture the state of the database (i.e., we copy +# TEST it. Then we run a transaction containing a single operation. In +# TEST one test, we abort the transaction and compare the outcome to the +# TEST original copy of the file. In the second test, we restore the +# TEST original copy of the database and then run recovery and compare +# TEST this against the actual database. proc recd001 { method {select 0} args} { global fixed_len source ./include.tcl @@ -43,7 +51,7 @@ proc recd001 { method {select 0} args} { set flags "-create -txn -home $testdir" puts "\tRecd001.a.0: creating environment" - set env_cmd "berkdb env $flags" + set env_cmd "berkdb_env $flags" set dbenv [eval $env_cmd] error_check_good dbenv [is_valid_env $dbenv] TRUE @@ -124,6 +132,7 @@ proc recd001 { method {select 0} args} { set newdata NEWrecd001_dataNEW set off 3 set len 12 + set partial_grow replacement_record_grow set partial_shrink xxx if { [is_fixed_length $method] == 1 } { @@ -165,16 +174,69 @@ proc recd001 { method {select 0} args} { # } op_recover abort $testdir $env_cmd $testfile $cmd $msg op_recover commit $testdir $env_cmd $testfile $cmd $msg - op_recover prepare $testdir $env_cmd $testfile2 $cmd $msg - op_recover prepare-abort $testdir $env_cmd $testfile2 $cmd $msg - op_recover prepare-commit $testdir $env_cmd $testfile2 $cmd $msg + # + # Note that since prepare-discard ultimately aborts + # the txn, it must come before prepare-commit. + # + op_recover prepare-abort $testdir $env_cmd $testfile2 \ + $cmd $msg + op_recover prepare-discard $testdir $env_cmd $testfile2 \ + $cmd $msg + op_recover prepare-commit $testdir $env_cmd $testfile2 \ + $cmd $msg } set fixed_len $orig_fixed_len - puts "\tRecd001.o: Verify db_printlog can read logfile" - set tmpfile $testdir/printlog.out - set stat [catch {exec $util_path/db_printlog -h $testdir \ - > $tmpfile} ret] - error_check_good db_printlog $stat 0 - fileremove $tmpfile + if { [is_fixed_length $method] == 1 } { + puts "Skipping remainder of test for fixed length methods" + return + } + + # + # Check partial extensions. If we add a key/data to the database + # and then expand it using -partial, then recover, recovery was + # failing in #3944. Check that scenario here. + # + # !!! + # We loop here because on each iteration, we need to clean up + # the old env (i.e. this test does not depend on earlier runs). + # If we run it without cleaning up the env inbetween, we do not + # test the scenario of #3944. + # + set len [string length $data] + set len2 256 + set part_data [replicate "abcdefgh" 32] + set p [list 0 $len] + set cmd [subst \ + {DB put -txn TXNID -partial {$len $len2} $key $part_data}] + set msg "Recd001.o: partial put prepopulated/expanding" + foreach op {abort commit prepare-abort prepare-discard prepare-commit} { + env_cleanup $testdir + + set dbenv [eval $env_cmd] + error_check_good dbenv [is_valid_env $dbenv] TRUE + set t [$dbenv txn] + error_check_good txn_begin [is_valid_txn $t $dbenv] TRUE + set oflags "-create $omethod -mode 0644 \ + -env $dbenv -txn $t $opts $testfile" + set db [eval {berkdb_open} $oflags] + error_check_good db_open [is_valid_db $db] TRUE + set oflags "-create $omethod -mode 0644 \ + -env $dbenv -txn $t $opts $testfile2" + set db2 [eval {berkdb_open} $oflags] + error_check_good db_open [is_valid_db $db2] TRUE + + set ret [$db put -txn $t -partial $p $key $data] + error_check_good dbput $ret 0 + + set ret [$db2 put -txn $t -partial $p $key $data] + error_check_good dbput $ret 0 + error_check_good txncommit [$t commit] 0 + error_check_good dbclose [$db close] 0 + error_check_good dbclose [$db2 close] 0 + error_check_good dbenvclose [$dbenv close] 0 + + op_recover $op $testdir $env_cmd $testfile $cmd $msg + } + return } |