summaryrefslogtreecommitdiff
path: root/test/recd016.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'test/recd016.tcl')
-rw-r--r--test/recd016.tcl180
1 files changed, 0 insertions, 180 deletions
diff --git a/test/recd016.tcl b/test/recd016.tcl
deleted file mode 100644
index 12c69e5..0000000
--- a/test/recd016.tcl
+++ /dev/null
@@ -1,180 +0,0 @@
-# See the file LICENSE for redistribution information.
-#
-# Copyright (c) 1996-2009 Oracle. All rights reserved.
-#
-# $Id$
-#
-# TEST recd016
-# TEST Test recovery after checksum error.
-proc recd016 { method args} {
- global fixed_len
- global log_log_record_types
- global datastr
- source ./include.tcl
-
- set pgindex [lsearch -exact $args "-pagesize"]
- if { $pgindex != -1 } {
- puts "Recd016: skipping for specific pagesizes"
- return
- }
- if { [is_queueext $method] == 1 || [is_partitioned $args]} {
- puts "Recd016: skipping for method $method"
- return
- }
-
- puts "Recd016: $method recovery after checksum error"
-
- # Create the database and environment.
- env_cleanup $testdir
-
- set testfile recd016.db
- set flags "-create -txn -home $testdir"
-
- puts "\tRecd016.a: creating environment"
- set env_cmd "berkdb_env $flags"
- set dbenv [eval $env_cmd]
- error_check_good dbenv [is_valid_env $dbenv] TRUE
-
- set pgsize 512
- set orig_fixed_len $fixed_len
- set fixed_len [expr $pgsize / 4]
- set opts [convert_args $method $args]
- set omethod [convert_method $method]
- set oflags "-create $omethod -mode 0644 \
- -auto_commit -chksum -pagesize $pgsize $opts $testfile"
- set db [eval {berkdb_open} -env $dbenv $oflags]
-
- #
- # Put some data.
- #
- set nument 50
- puts "\tRecd016.b: Put some data"
- for { set i 1 } { $i <= $nument } { incr i } {
- # Use 'i' as key so method doesn't matter
- set key $i
- set data $i$datastr
-
- # Put, in a txn.
- set txn [$dbenv txn]
- error_check_good txn_begin [is_valid_txn $txn $dbenv] TRUE
- error_check_good db_put \
- [$db put -txn $txn $key [chop_data $method $data]] 0
- error_check_good txn_commit [$txn commit] 0
- }
- error_check_good db_close [$db close] 0
- error_check_good log_flush [$dbenv log_flush] 0
- error_check_good env_close [$dbenv close] 0
- #
- # We need to remove the env so that we don't get cached
- # pages.
- #
- error_check_good env_remove [berkdb envremove -home $testdir] 0
-
- puts "\tRecd016.c: Overwrite part of database"
- #
- # First just touch some bits in the file. We want to go
- # through the paging system, so touch some data pages,
- # like the middle of page 2.
- # We should get a checksum error for the checksummed file.
- #
- set pg 2
- set fid [open $testdir/$testfile r+]
- fconfigure $fid -translation binary
- set seeklen [expr $pgsize * $pg + 200]
- seek $fid $seeklen start
- set byte [read $fid 1]
- binary scan $byte c val
- set newval [expr ~$val]
- set newbyte [binary format c $newval]
- seek $fid $seeklen start
- puts -nonewline $fid $newbyte
- close $fid
-
- #
- # Verify we get the checksum error. When we get it, it should
- # log the error as well, so when we run recovery we'll need to
- # do catastrophic recovery. We do this in a sub-process so that
- # the files are closed after the panic.
- #
- set f1 [open |$tclsh_path r+]
- puts $f1 "source $test_path/test.tcl"
-
- set env_cmd "berkdb_env_noerr $flags"
- set dbenv [send_cmd $f1 $env_cmd]
- error_check_good dbenv [is_valid_env $dbenv] TRUE
-
- set db [send_cmd $f1 "{berkdb_open_noerr} -env $dbenv $oflags"]
- error_check_good db [is_valid_db $db] TRUE
-
- # We need to set non-blocking mode so that after each command
- # we can read all the remaining output from that command and
- # we can know what the output from one command is.
- fconfigure $f1 -blocking 0
- set ret [read $f1]
- set got_err 0
- for { set i 1 } { $i <= $nument } { incr i } {
- set stat [send_cmd $f1 "catch {$db get $i} r"]
- set getret [send_cmd $f1 "puts \$r"]
- set ret [read $f1]
- if { $stat == 1 } {
- error_check_good dbget:fail [is_substr $getret \
- "checksum error: page $pg"] 1
- set got_err 1
- break
- } else {
- set key [lindex [lindex $getret 0] 0]
- set data [lindex [lindex $getret 0] 1]
- error_check_good keychk $key $i
- error_check_good datachk $data \
- [pad_data $method $i$datastr]
- }
- }
- error_check_good got_chksum $got_err 1
- set ret [send_cmd $f1 "$db close"]
- set extra [read $f1]
- error_check_good db:fail [is_substr $ret "run recovery"] 1
-
- set ret [send_cmd $f1 "$dbenv close"]
- error_check_good env_close:fail [is_substr $ret "handles still open"] 1
- close $f1
-
- # Keep track of the log types we've seen
- if { $log_log_record_types == 1} {
- logtrack_read $testdir
- }
-
- puts "\tRecd016.d: Run normal recovery"
- set ret [catch {exec $util_path/db_recover -h $testdir} r]
- error_check_good db_recover $ret 1
- error_check_good dbrec:fail \
- [is_substr $r "checksum error"] 1
-
- catch {fileremove $testdir/$testfile} ret
- puts "\tRecd016.e: Run catastrophic recovery"
- set ret [catch {exec $util_path/db_recover -c -h $testdir} r]
- error_check_good db_recover $ret 0
-
- #
- # Now verify the data was reconstructed correctly.
- #
- set env_cmd "berkdb_env_noerr $flags"
- set dbenv [eval $env_cmd]
- error_check_good dbenv [is_valid_env $dbenv] TRUE
-
- set db [eval {berkdb_open} -env $dbenv $oflags]
- error_check_good db [is_valid_db $db] TRUE
-
- for { set i 1 } { $i <= $nument } { incr i } {
- set stat [catch {$db get $i} ret]
- error_check_good stat $stat 0
- set key [lindex [lindex $ret 0] 0]
- set data [lindex [lindex $ret 0] 1]
- error_check_good keychk $key $i
- error_check_good datachk $data [pad_data $method $i$datastr]
- }
- error_check_good db_close [$db close] 0
- error_check_good log_flush [$dbenv log_flush] 0
- error_check_good env_close [$dbenv close] 0
- set fixed_len $orig_fixed_len
- return
-}