diff options
Diffstat (limited to 'db-4.8.30/test/recd022.tcl')
-rw-r--r-- | db-4.8.30/test/recd022.tcl | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/db-4.8.30/test/recd022.tcl b/db-4.8.30/test/recd022.tcl new file mode 100644 index 0000000..cdcf109 --- /dev/null +++ b/db-4.8.30/test/recd022.tcl @@ -0,0 +1,136 @@ +# See the file LICENSE for redistribution information. +# +# Copyright (c) 1996-2009 Oracle. All rights reserved. +# +# $Id$ +# +# TEST recd022 +# TEST Test that pages allocated by an aborted subtransaction +# TEST within an aborted prepared parent transaction are returned +# TEST to the free list after recovery. This exercises +# TEST __db_pg_prepare in systems without FTRUNCATE. [#7403] + +proc recd022 { method args} { + global log_log_record_types + global fixed_len + global is_hp_test + source ./include.tcl + + # Skip test for specified page sizes -- we want to + # specify our own page size. + set pgindex [lsearch -exact $args "-pagesize"] + if { $pgindex != -1 } { + puts "Recd022: Skipping for specific pagesizes" + return + } + + # Skip the test for HP-UX, where we can't open an env twice. + if { $is_hp_test == 1 } { + puts "Recd022: Skipping for HP-UX." + return + } + + + # Increase size of fixed-length records to match other methods. + set orig_fixed_len $fixed_len + set fixed_len 53 + set opts [convert_args $method $args] + set omethod [convert_method $method] + + puts "Recd022: ($method) Page allocation and recovery" + puts "Recd022: with aborted prepared txns and child txns." + + # Create the database and environment. + env_cleanup $testdir + set testfile recd022.db + + puts "\tRecd022.a: creating environment" + # We open the env and database with _noerr so we don't + # get error messages when cleaning up at the end of the test. + set env_cmd "berkdb_env_noerr -create -txn -home $testdir" + set dbenv [eval $env_cmd] + error_check_good dbenv [is_valid_env $dbenv] TRUE + + # Open database with small pages. + puts "\tRecd022.b: creating database with small pages" + set pagesize 512 + set oflags "-create $omethod -mode 0644 -pagesize $pagesize \ + -env $dbenv -auto_commit $opts $testfile" + set db [eval {berkdb_open_noerr} $oflags] + error_check_good db_open [is_valid_db $db] TRUE + + puts "\tRecd022.c: start transaction, put some data" + set iter 10 + set datasize 53 + set data [repeat "a" $datasize] + set iter2 [expr $iter * 2] + + # Start parent and child txns. + puts "\tRecd022.d: start child txn, put some data" + set parent [$dbenv txn] + set child1 [$dbenv txn -parent $parent] + + # Child puts some new data. + for { set i 1 } {$i <= $iter } { incr i } { + eval {$db put} -txn $child1 $i $data + } + + # Abort the child txn. + puts "\tRecd022.e: abort child txn" + error_check_good child1_abort [$child1 abort] 0 + + # Start a second child. Put some data, enough to allocate + # a new page, then delete it. + puts "\tRecd022.f: start second child txn, put some data" + set child2 [$dbenv txn -parent $parent] + for { set i 1 } { $i <= $iter2 } { incr i } { + eval {$db put} -txn $child2 $i $data + } + for { set i 1 } { $i <= $iter2 } { incr i } { + eval {$db del} -txn $child2 $i + } + + # Put back half the data. + for { set i 1 } { $i <= $iter } { incr i } { + eval {$db put} -txn $child2 $i $data + } + + # Commit second child + puts "\tRecd022.g: commit second child txn, prepare parent" + error_check_good child2_commit [$child2 commit] 0 + + # Prepare parent + error_check_good prepare [$parent prepare "ABC"] 0 + + # Recover, then abort the recovered parent txn + puts "\tRecd022.h: recover, then abort parent" + set env1 [berkdb_env -create -recover -home $testdir -txn] + set txnlist [$env1 txn_recover] + set aborttxn [lindex [lindex $txnlist 0] 0] + error_check_good parent_abort [$aborttxn abort] 0 + + # Verify database and then clean up. We still need to get + # rid of the handles created before recovery. + puts "\tRecd022.i: verify and clean up" + if { [is_partition_callback $args] == 1 } { + set nodump 1 + } else { + set nodump 0 + } + verify_dir $testdir "" 1 0 $nodump + set stat [catch {$db close} res] + error_check_good db_close [is_substr $res "run recovery"] 1 + error_check_good env1_close [$env1 close] 0 + set stat [catch {$dbenv close} res] + error_check_good dbenv_close [is_substr $res "run recovery"] 1 + + # Track the log types we've seen + if { $log_log_record_types == 1} { + logtrack_read $testdir + } + + # Set fixed_len back to the global value so we don't + # mess up other tests. + set fixed_len $orig_fixed_len + return +} |