proc recd022 { method args} {
global log_log_record_types
global fixed_len
global is_hp_test
source ./include.tcl
set pgindex [lsearch -exact $args "-pagesize"]
if { $pgindex != -1 } {
puts "Recd022: Skipping for specific pagesizes"
return
}
if { $is_hp_test == 1 } {
puts "Recd022: Skipping for HP-UX."
return
}
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."
env_cleanup $testdir
set testfile recd022.db
puts "\tRecd022.a: creating environment"
set env_cmd "berkdb_env_noerr -create -txn -home $testdir"
set dbenv [eval $env_cmd]
error_check_good dbenv [is_valid_env $dbenv] TRUE
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]
puts "\tRecd022.d: start child txn, put some data"
set parent [$dbenv txn]
set child1 [$dbenv txn -parent $parent]
for { set i 1 } {$i <= $iter } { incr i } {
eval {$db put} -txn $child1 $i $data
}
puts "\tRecd022.e: abort child txn"
error_check_good child1_abort [$child1 abort] 0
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
}
for { set i 1 } { $i <= $iter } { incr i } {
eval {$db put} -txn $child2 $i $data
}
puts "\tRecd022.g: commit second child txn, prepare parent"
error_check_good child2_commit [$child2 commit] 0
error_check_good prepare [$parent prepare "ABC"] 0
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
puts "\tRecd022.i: verify and clean up"
verify_dir $testdir
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
if { $log_log_record_types == 1} {
logtrack_read $testdir
}
set fixed_len $orig_fixed_len
return
}