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