Import BSDDB 4.7.25 (as of svn r89086)
This commit is contained in:
110
test/log007.tcl
Normal file
110
test/log007.tcl
Normal file
@@ -0,0 +1,110 @@
|
||||
# See the file LICENSE for redistribution information.
|
||||
#
|
||||
# Copyright (c) 2005,2008 Oracle. All rights reserved.
|
||||
#
|
||||
# $Id: log007.tcl,v 12.8 2008/01/08 20:58:53 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
|
||||
}
|
||||
Reference in New Issue
Block a user