1# See the file LICENSE for redistribution information. 2# 3# Copyright (c) 2004,2008 Oracle. All rights reserved. 4# 5# $Id: recd023.tcl,v 12.9 2008/01/08 20:58:53 bostic Exp $ 6# 7# TEST recd023 8# TEST Test recover of reverse split. 9# 10proc recd023 { method args } { 11 source ./include.tcl 12 env_cleanup $testdir 13 set tnum "023" 14 15 if { [is_btree $method] != 1 && [is_rbtree $method] != 1 } { 16 puts "Skipping recd$tnum for method $method" 17 return 18 } 19 20 set args [convert_args $method $args] 21 set omethod [convert_method $method] 22 23 puts "Recd$tnum ($omethod $args): Recovery of reverse split." 24 set testfile recd$tnum.db 25 26 puts "\tRecd$tnum.a: Create environment and database." 27 set flags "-create -txn -home $testdir" 28 29 set env_cmd "berkdb_env $flags" 30 set env [eval $env_cmd] 31 error_check_good env [is_valid_env $env] TRUE 32 33 set pagesize 512 34 set oflags "$omethod -auto_commit \ 35 -pagesize $pagesize -create -mode 0644 $args" 36 set db [eval {berkdb_open} -env $env $oflags $testfile] 37 error_check_good dbopen [is_valid_db $db] TRUE 38 39 # Write to database -- enough to fill at least 3 levels. 40 puts "\tRecd$tnum.b: Create a 3 level btree database." 41 set nentries 1000 42 set datastr [repeat x 45] 43 for { set i 1 } { $i < $nentries } { incr i } { 44 set key a$i 45 set ret [$db put $key [chop_data $method $datastr]] 46 error_check_good put $ret 0 47 } 48 49 # Verify we have enough levels. 50 set levels [stat_field $db stat "Levels"] 51 error_check_good 3_levels [expr $levels >= 3] 1 52 53 # Save the original database. 54 file copy -force $testdir/$testfile $testdir/$testfile.save 55 56 # Delete enough pieces to collapse the tree. 57 puts "\tRecd$tnum.c: Do deletes to collapse database." 58 for { set count 2 } { $count < 10 } { incr count } { 59 error_check_good db_del [$db del a$count] 0 60 } 61 for { set count 15 } { $count < 100 } { incr count } { 62 error_check_good db_del [$db del a$count] 0 63 } 64 for { set count 150 } { $count < 1000 } { incr count } { 65 error_check_good db_del [$db del a$count] 0 66 } 67 68 error_check_good db_close [$db close] 0 69 error_check_good verify_dir [verify_dir $testdir "\tRecd$tnum.d: "] 0 70 71 # Overwrite the current database with the saved database. 72 file copy -force $testdir/$testfile.save $testdir/$testfile 73 error_check_good log_flush [$env log_flush] 0 74 error_check_good env_close [$env close] 0 75 76 # Recover the saved database to roll forward and apply the deletes. 77 set env [berkdb_env -create -txn -home $testdir -recover] 78 error_check_good env_open [is_valid_env $env] TRUE 79 error_check_good log_flush [$env log_flush] 0 80 error_check_good env_close [$env close] 0 81 82 error_check_good verify_dir [verify_dir $testdir "\tRecd$tnum.e: "] 0 83} 84