summaryrefslogtreecommitdiff
path: root/db/test/log006.tcl
blob: 4b964a73dd83037d727de7a2ab1337fe3bffe6f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# See the file LICENSE for redistribution information.
#
# Copyright (c) 1996-2003
#	Sleepycat Software.  All rights reserved.
#
# $Id: log006.tcl,v 11.5 2003/09/04 23:41:11 bostic Exp $
#
# TEST	log006
# TEST	Test log file auto-remove.
# TEST		Test normal operation.
# TEST		Test a long-lived txn.
# TEST		Test log_archive flags.
# TEST		Test db_archive flags.
# TEST		Test turning on later.
# TEST		Test setting via DB_CONFIG.
proc log006 { } {
	source ./include.tcl

	puts "Log006: Check auto-remove of log files."
	env_cleanup $testdir

	# Open the environment, set auto-remove flag.  Use smaller log
	# files to make more of them.
	puts "\tLog006.a: open environment, populate database."
	set env [berkdb_env_noerr -log_remove \
	    -create -home $testdir -log_buffer 10000 -log_max 100000 -txn]
	error_check_good envopen [is_valid_env $env] TRUE

	log006_put $testdir $env

	#
	# Check log files.  Using the small log file size, we should
	# have made a lot of log files, check that we have a reasonable
	# number left, less than 12.
	#
	set log_expect 12
	puts "\tLog006.b: Check log files removed."
	set lfiles [glob -nocomplain $testdir/log.*]
	set remlen [llength $lfiles]
	error_check_good lfiles_len [expr $remlen < $log_expect] 1
	error_check_good lfiles [lsearch $lfiles $testdir/log.0000000001] -1
	# Save last log file for later check.
	# Files may not be sorted, sort them and then save the last filename.
	set oldfile [lindex [lsort -ascii $lfiles] end]

	#
	# Rerun log006_put with a long lived txn.  This unresolved txn will
	# mean that no files will be able to be removed.
	#
	puts "\tLog006.c: Rerun put loop with long-lived transaction."
	set txn [$env txn]
	error_check_good txn [is_valid_txn $txn $env] TRUE
	log006_put $testdir $env

	puts "\tLog006.d: Check log files not removed."
	set lfiles [glob -nocomplain $testdir/log.*]
	error_check_good lfiles2_len [expr [llength $lfiles] > $remlen] 1
	set lfiles [lsort -ascii $lfiles]
	error_check_good lfiles_chk [lsearch $lfiles $oldfile] 0
	error_check_good txn_commit [$txn commit] 0
	error_check_good ckp1 [$env txn_checkpoint] 0
	error_check_good ckp2 [$env txn_checkpoint] 0

	puts "\tLog006.e: Run log_archive with -auto_remove flag."
	# When we're done, only the last log file should remain.
	set lfiles [glob -nocomplain $testdir/log.*]
	set oldfile [lindex [lsort -ascii $lfiles] end]

	# First, though, verify mutual-exclusiveness of flag.
	foreach f {-arch_abs -arch_data -arch_log} {
		set stat [catch {eval $env log_archive -arch_remove $f} ret]
		error_check_good stat $stat 1
		error_check_good la:$f:fail [is_substr $ret "illegal flag"] 1
	}
	# Now run it for real.
	set stat [catch {$env log_archive -arch_remove} ret]
	error_check_good stat $stat 0

	puts "\tLog006.f: Check only $oldfile remains."
	set lfiles [glob -nocomplain $testdir/log.*]
	error_check_good 1log [llength $lfiles] 1
	error_check_good lfiles_chk [lsearch $lfiles $oldfile] 0

	puts "\tLog006.g: Rerun put loop with long-lived transaction."
	set txn [$env txn]
	error_check_good txn [is_valid_txn $txn $env] TRUE
	log006_put $testdir $env
	error_check_good txn_commit [$txn commit] 0
	error_check_good ckp1 [$env txn_checkpoint] 0
	error_check_good ckp2 [$env txn_checkpoint] 0
	error_check_good env_close [$env close] 0

	#
	# Test db_archive's auto-remove flag.
	# After we are done, only the last log file should be there.
	# First check that the delete flag cannot be used with any
	# of the other flags.
	#
	puts "\tLog006.h: Run db_archive with delete flag."
	set lfiles [glob -nocomplain $testdir/log.*]
	set oldfile [lindex [lsort -ascii $lfiles] end]
	#
	# Again, first check illegal flag combinations with db_archive.
	#
	foreach f {-a -l -s} {
		set stat [catch {exec $util_path/db_archive $f -d -h $testdir} \
		    ret]
		error_check_good stat $stat 1
		error_check_good la:fail [is_substr $ret "illegal flag"] 1
	}
	set stat [catch {exec $util_path/db_archive -d -h $testdir} ret]
	error_check_good stat $stat 0

	puts "\tLog006.i: Check only $oldfile remains."
	set lfiles [glob -nocomplain $testdir/log.*]
	error_check_good 1log [llength $lfiles] 1
	error_check_good lfiles_chk [lsearch $lfiles $oldfile] 0

	#
	# Now rerun some parts with other env settings tested.
	#
	env_cleanup $testdir

	# First test that the option can be turned on later.
	# 1. Open env w/o auto-remove.
	# 2. Run log006_put.
	# 3. Verify log files all there.
	# 4. Call env set_flags to turn it on.
	# 5. Run log006_put.
	# 6. Verify log files removed.
	puts "\tLog006.j: open environment w/o auto remove, populate database."
	set env [berkdb_env -recover \
	    -create -home $testdir -log_buffer 10000 -log_max 100000 -txn]
	error_check_good envopen [is_valid_env $env] TRUE

	log006_put $testdir $env

	puts "\tLog006.k: Check log files not removed."
	set lfiles [glob -nocomplain $testdir/log.*]
	error_check_good lfiles2_len [expr [llength $lfiles] > $remlen] 1
	set lfiles [lsort -ascii $lfiles]
	error_check_good lfiles [lsearch $lfiles $testdir/log.0000000001] 0

	puts "\tLog006.l: turn on auto remove and repopulate database."
	error_check_good sf [$env set_flags -log_remove on] 0

	log006_put $testdir $env

	puts "\tLog006.m: Check log files removed."
	set lfiles [glob -nocomplain $testdir/log.*]
	error_check_good lfiles_len [expr [llength $lfiles] < $log_expect] 1
	error_check_good lfiles [lsearch $lfiles $testdir/log.0000000001] -1
	error_check_good env_close [$env close] 0

	#
	# Configure via DB_CONFIG.
	#
	env_cleanup $testdir

	puts "\tLog006.n: Test setting via DB_CONFIG."
	# Open the environment, w/o remove flag, but DB_CONFIG.
	set cid [open $testdir/DB_CONFIG w]
	puts $cid "set_flags db_log_autoremove"
	close $cid
	set env [berkdb_env -recover \
	    -create -home $testdir -log_buffer 10000 -log_max 100000 -txn]
	error_check_good envopen [is_valid_env $env] TRUE

	log006_put $testdir $env

	puts "\tLog006.o: Check log files removed."
	set lfiles [glob -nocomplain $testdir/log.*]
	error_check_good lfiles_len [expr [llength $lfiles] < $log_expect] 1
	error_check_good lfiles [lsearch $lfiles $testdir/log.0000000001] -1
	error_check_good env_close [$env close] 0

}

#
# Modified from test003.
#
proc log006_put { testdir env } {

	set testfile log006.db
	set limit 100

	cleanup $testdir $env
	#
	# Specify a pagesize so we can control how many log files
	# are created and left over.
	#
	set db [eval {berkdb_open_noerr -create -mode 0644} \
	    -env $env -auto_commit -pagesize 8192 -btree $testfile]
	error_check_good dbopen [is_valid_db $db] TRUE

	set file_list [get_file_list]
	if { [llength $file_list] > $limit } {
		set file_list [lrange $file_list 1 $limit]
	}
	set len [llength $file_list]
	set count 0
	foreach f $file_list {
		if { [string compare [file type $f] "file"] != 0 } {
			continue
		}
		set key $f
		# Should really catch errors
		set fid [open $f r]
		fconfigure $fid -translation binary
		set data [read $fid]
		close $fid

		set t [$env txn]
		error_check_good txn [is_valid_txn $t $env] TRUE
		set txn "-txn $t"
		set ret [eval {$db put} $txn {$key $data}]
		error_check_good put $ret 0
		error_check_good txn [$t commit] 0
		if { $count % 10 == 0 } {
			error_check_good ckp($count) [$env txn_checkpoint] 0
		}

		incr count
	}
	error_check_good db_close [$db close] 0
}