diff options
Diffstat (limited to 'db/test/log007.tcl')
-rw-r--r-- | db/test/log007.tcl | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/db/test/log007.tcl b/db/test/log007.tcl new file mode 100644 index 000000000..b430003b3 --- /dev/null +++ b/db/test/log007.tcl @@ -0,0 +1,111 @@ +# See the file LICENSE for redistribution information. +# +# Copyright (c) 2005-2006 +# Oracle Corporation. All rights reserved. +# +# $Id: log007.tcl,v 12.5 2006/08/24 14:46:36 bostic Exp $ +# +# TEST log007 +# TEST Test of in-memory logging bugs. [#11505] +# TEST +# TEST Test db_printlog with in-memory logs. +# +proc log007 { } { + global testdir + global util_path + set tnum "007" + + puts "Log$tnum: Test in-memory logs with db_printlog." + + # Log size is small so we quickly create more than one. + # Since we are in-memory the buffer is larger than the + # file size. + set pagesize 4096 + append args " -pagesize $pagesize " + set log_max [expr $pagesize * 2] + set log_buf [expr $log_max * 2] + + # We have 13-byte records. We want to fill slightly more + # than one virtual log file on each iteration. The first + # record always has an offset of 28. + # + set recsize 13 + set recsperfile [expr [expr $log_max - 28] / $recsize] + set nrecs [expr $recsperfile + 1] + + # Open environment. + env_cleanup $testdir + set flags " -create -txn -home $testdir \ + -log_inmemory -log_buffer $log_buf -log_max $log_max" + set env [eval {berkdb_env} $flags] + error_check_good env_open [is_valid_env $env] TRUE + + set iter 15 + set lastfile 1 + for { set i 0 } { $i < $iter } { incr i } { + puts "\tLog$tnum.a.$i: Writing $nrecs 13-byte log records." + set lsn_list {} + for { set j 0 } { $j < $nrecs } { incr j } { + set rec "1" + # Make the first record one byte larger for each + # successive log file so we hit the end of the + # log file at each of the 13 possibilities. + set nentries [expr [expr $i * $nrecs] + $j] + if { [expr $nentries % 628] == 0 } { + append firstrec a + set ret [$env log_put $firstrec] + } else { + set ret [$env log_put $rec] + } + error_check_bad log_put [is_substr $ret log_cmd] 1 + lappend lsn_list $ret + } + + # Open a log cursor. + set m_logc [$env log_cursor] + error_check_good m_logc [is_valid_logc $m_logc $env] TRUE + + # Check that we're in the expected virtual log file. + set first [$m_logc get -first] + error_check_good first_lsn [lindex $first 0] "[expr $i + 1] 28" + set last [$m_logc get -last] + + puts "\tLog$tnum.b.$i: Read log records sequentially." + set j 0 + for { set logrec [$m_logc get -first] } \ + { [llength $logrec] != 0 } \ + { set logrec [$m_logc get -next]} { + set file [lindex [lindex $logrec 0] 0] + if { $file != $lastfile } { + # We have entered a new virtual log file. + set lastfile $file + } + set offset [lindex [lindex $logrec 0] 1] + set lsn($j) "\[$file\]\[$offset\]" + incr j + } + error_check_good cursor_close [$m_logc close] 0 + + puts "\tLog$tnum.c.$i: Compare printlog to log records." + set stat [catch {eval exec $util_path/db_printlog \ + -h $testdir > $testdir/prlog} result] + error_check_good stat_prlog $stat 0 + + # Make sure the results of printlog contain all the same + # LSNs we saved when walking the files with the log cursor. + set j 0 + set fd [open $testdir/prlog r] + while { [gets $fd record] >= 0 } { + # A log record begins with "[". + if { [string match {\[*} $record] == 1 } { + error_check_good \ + check_prlog [is_substr $record $lsn($j)] 1 + incr j + } + } + close $fd + } + + error_check_good env_close [$env close] 0 + error_check_good env_remove [berkdb envremove -home $testdir] 0 +} |