# See the file LICENSE for redistribution information. # # Copyright (c) 2004,2008 Oracle. All rights reserved. # # $Id: log009.tcl,v 12.9 2008/01/08 20:58:53 bostic Exp $ # # TEST log009 # TEST Test of logging and getting log file version information. # TEST Each time we cross a log file boundary verify we can # TEST get the version via the log cursorlag. # TEST Do this both forward and backward. # proc log009 { } { source ./include.tcl global errorInfo env_cleanup $testdir set niter 200 set method btree puts "Log009: Retrieve log version using log cursor." # Log size is small so we quickly create more than one. # The documentation says that the log file must be at least # four times the size of the in-memory log buffer. set pagesize 4096 append largs " -pagesize $pagesize " set log_buf [expr $pagesize * 2] set log_max [expr $log_buf * 4] # Open an env. set envcmd "berkdb_env_noerr -create \ -log_buffer $log_buf -log_max $log_max -txn -home $testdir" set env [eval $envcmd] error_check_good env [is_valid_env $env] TRUE set stop 0 set start 0 # # Loop until we have at least 3 log files. # while { $stop == 0 } { puts "\tLog009.a: Running test in to generate log files." eval rep_test \ $method $env NULL $niter $start $start 0 0 $largs incr start $niter set last_log [get_logfile $env last] if { $last_log >= 3 } { set stop 1 } } # We now have at least 3 log files. Walk a cursor both ways # through the log and make sure we can get the version when we # cross a log file boundary. set curfile 0 set logc [$env log_cursor] error_check_good logc [is_valid_logc $logc $env] TRUE puts "\tLog009.b: Try to get version on unset cursor." set stat [catch {eval $logc version} ret] error_check_bad stat $stat 0 error_check_good err [is_substr $ret "unset cursor"] 1 # Check walking forward through logs looking for log # file boundaries. # puts "\tLog009.c: Walk log forward checking persist." for { set logrec [$logc get -first] } \ { [llength $logrec] != 0 } \ { set logrec [$logc get -next] } { set lsn [lindex $logrec 0] set lsnfile [lindex $lsn 0] if { $curfile != $lsnfile } { log009_check $logc $logrec set curfile $lsnfile } } error_check_good logclose [$logc close] 0 set curfile 0 set logc [$env log_cursor] error_check_good logc [is_valid_logc $logc $env] TRUE # # Check walking backward through logs looking for log # file boundaries. # puts "\tLog009.d: Walk log backward checking persist." for { set logrec [$logc get -last] } \ { [llength $logrec] != 0 } \ { set logrec [$logc get -prev] } { set lsn [lindex $logrec 0] set lsnfile [lindex $lsn 0] if { $curfile != $lsnfile } { log009_check $logc $logrec set curfile $lsnfile } } error_check_good logclose [$logc close] 0 error_check_good env_close [$env close] 0 } proc log009_check { logc logrec } { set version [$logc version] # # We don't have ready access to the current log # version, but make sure it is something reasonable. # # !!! # First readable log is 8, current log version # is pretty far from 20. # set reasonable [expr $version > 7 && $version < 20] error_check_good persist $reasonable 1 # # Verify that getting the version doesn't move # or change the log cursor in any way. # set logrec1 [$logc get -current] error_check_good current $logrec $logrec1 }