mirror of
https://github.com/berkeleydb/libdb.git
synced 2024-11-16 17:16:25 +00:00
144 lines
4.1 KiB
Tcl
144 lines
4.1 KiB
Tcl
|
# See the file LICENSE for redistribution information.
|
||
|
#
|
||
|
# Copyright (c) 1996, 2011 Oracle and/or its affiliates. All rights reserved.
|
||
|
#
|
||
|
# $Id$
|
||
|
#
|
||
|
# TEST log003
|
||
|
# TEST Verify that log_flush is flushing records correctly.
|
||
|
proc log003 { } {
|
||
|
global rand_init
|
||
|
error_check_good set_random_seed [berkdb srand $rand_init] 0
|
||
|
|
||
|
# Even though log_flush doesn't do anything for in-memory
|
||
|
# logging, we want to make sure calling it doesn't break
|
||
|
# anything.
|
||
|
foreach inmem { 1 0 } {
|
||
|
log003_body $inmem
|
||
|
}
|
||
|
}
|
||
|
|
||
|
proc log003_body { inmem } {
|
||
|
source ./include.tcl
|
||
|
|
||
|
puts -nonewline "Log003: Verify log_flush behavior"
|
||
|
if { $inmem == 0 } {
|
||
|
puts " (on-disk logging)."
|
||
|
} else {
|
||
|
puts " (in-memory logging)."
|
||
|
}
|
||
|
|
||
|
set max [expr 1024 * 128]
|
||
|
env_cleanup $testdir
|
||
|
set short_rec "abcdefghijklmnopqrstuvwxyz"
|
||
|
set long_rec [repeat $short_rec 200]
|
||
|
set very_long_rec [repeat $long_rec 4]
|
||
|
|
||
|
foreach rec "$short_rec $long_rec $very_long_rec" {
|
||
|
puts "\tLog003.a: Verify flush on [string length $rec] byte rec"
|
||
|
|
||
|
set logargs ""
|
||
|
if { $inmem == 1 } {
|
||
|
set logargs "-log_inmemory -log_buffer [expr $max * 2]"
|
||
|
}
|
||
|
set env [eval {berkdb_env} -log -home $testdir -create \
|
||
|
-mode 0644 $logargs -log_max $max]
|
||
|
error_check_good envopen [is_valid_env $env] TRUE
|
||
|
|
||
|
set lsn [$env log_put $rec]
|
||
|
error_check_bad log_put [lindex $lsn 0] "ERROR:"
|
||
|
set ret [$env log_flush $lsn]
|
||
|
error_check_good log_flush $ret 0
|
||
|
|
||
|
# Now, we want to crash the region and recheck. Closing the
|
||
|
# log does not flush any records, so we'll use a close to
|
||
|
# do the "crash"
|
||
|
set ret [$env close]
|
||
|
error_check_good log_env:close $ret 0
|
||
|
|
||
|
# Now, remove the log region
|
||
|
#set ret [berkdb envremove -home $testdir]
|
||
|
#error_check_good env:remove $ret 0
|
||
|
|
||
|
# Re-open the log and try to read the record.
|
||
|
set env [berkdb_env -create -home $testdir \
|
||
|
-log -mode 0644 -log_max $max]
|
||
|
error_check_good envopen [is_valid_env $env] TRUE
|
||
|
|
||
|
set logc [$env log_cursor]
|
||
|
error_check_good log_cursor [is_valid_logc $logc $env] TRUE
|
||
|
|
||
|
set gotrec [$logc get -first]
|
||
|
error_check_good lp_get [lindex $gotrec 1] $rec
|
||
|
|
||
|
# Close and unlink the file
|
||
|
error_check_good log_cursor:close:$logc [$logc close] 0
|
||
|
error_check_good env:close:$env [$env close] 0
|
||
|
error_check_good envremove [berkdb envremove -home $testdir] 0
|
||
|
log_cleanup $testdir
|
||
|
}
|
||
|
|
||
|
if { $inmem == 1 } {
|
||
|
puts "Log003: Skipping remainder of test for in-memory logging."
|
||
|
return
|
||
|
}
|
||
|
|
||
|
foreach rec "$short_rec $long_rec $very_long_rec" {
|
||
|
puts "\tLog003.b: \
|
||
|
Verify flush on non-last record [string length $rec]"
|
||
|
|
||
|
set env [berkdb_env -log -home $testdir \
|
||
|
-create -mode 0644 -log_max $max]
|
||
|
|
||
|
error_check_good envopen [is_valid_env $env] TRUE
|
||
|
|
||
|
# Put 10 random records
|
||
|
for { set i 0 } { $i < 10 } { incr i} {
|
||
|
set r [random_data 450 0 0]
|
||
|
set lsn [$env log_put $r]
|
||
|
error_check_bad log_put [lindex $lsn 0] "ERROR:"
|
||
|
}
|
||
|
|
||
|
# Put the record we are interested in
|
||
|
set save_lsn [$env log_put $rec]
|
||
|
error_check_bad log_put [lindex $save_lsn 0] "ERROR:"
|
||
|
|
||
|
# Put 10 more random records
|
||
|
for { set i 0 } { $i < 10 } { incr i} {
|
||
|
set r [random_data 450 0 0]
|
||
|
set lsn [$env log_put $r]
|
||
|
error_check_bad log_put [lindex $lsn 0] "ERROR:"
|
||
|
}
|
||
|
|
||
|
# Now check the flush
|
||
|
set ret [$env log_flush $save_lsn]
|
||
|
error_check_good log_flush $ret 0
|
||
|
|
||
|
# Now, we want to crash the region and recheck. Closing the
|
||
|
# log does not flush any records, so we'll use a close to
|
||
|
# do the "crash".
|
||
|
#
|
||
|
# Now, close and remove the log region
|
||
|
error_check_good env:close:$env [$env close] 0
|
||
|
set ret [berkdb envremove -home $testdir]
|
||
|
error_check_good env:remove $ret 0
|
||
|
|
||
|
# Re-open the log and try to read the record.
|
||
|
set env [berkdb_env -log -home $testdir \
|
||
|
-create -mode 0644 -log_max $max]
|
||
|
error_check_good envopen [is_valid_env $env] TRUE
|
||
|
|
||
|
set logc [$env log_cursor]
|
||
|
error_check_good log_cursor [is_valid_logc $logc $env] TRUE
|
||
|
|
||
|
set gotrec [$logc get -set $save_lsn]
|
||
|
error_check_good lp_get [lindex $gotrec 1] $rec
|
||
|
|
||
|
# Close and unlink the file
|
||
|
error_check_good log_cursor:close:$logc [$logc close] 0
|
||
|
error_check_good env:close:$env [$env close] 0
|
||
|
error_check_good envremove [berkdb envremove -home $testdir] 0
|
||
|
log_cleanup $testdir
|
||
|
}
|
||
|
}
|