Import BSDDB 4.7.25 (as of svn r89086)
This commit is contained in:
153
test/memp003.tcl
Normal file
153
test/memp003.tcl
Normal file
@@ -0,0 +1,153 @@
|
||||
# See the file LICENSE for redistribution information.
|
||||
#
|
||||
# Copyright (c) 1996,2008 Oracle. All rights reserved.
|
||||
#
|
||||
# $Id: memp003.tcl,v 12.6 2008/01/08 20:58:53 bostic Exp $
|
||||
#
|
||||
# TEST memp003
|
||||
# TEST Test reader-only/writer process combinations; we use the access methods
|
||||
# TEST for testing.
|
||||
proc memp003 { } {
|
||||
global rand_init
|
||||
error_check_good set_random_seed [berkdb srand $rand_init] 0
|
||||
#
|
||||
# Multiple processes not supported by private memory so don't
|
||||
# run memp003_body with -private.
|
||||
#
|
||||
memp003_body ""
|
||||
memp003_body "-system_mem -shm_key 1"
|
||||
}
|
||||
|
||||
proc memp003_body { flags } {
|
||||
global alphabet
|
||||
source ./include.tcl
|
||||
|
||||
puts "Memp003: {$flags} Reader/Writer tests"
|
||||
|
||||
if { [mem_chk $flags] == 1 } {
|
||||
return
|
||||
}
|
||||
|
||||
env_cleanup $testdir
|
||||
set psize 1024
|
||||
set nentries 500
|
||||
set testfile mpool.db
|
||||
set t1 $testdir/t1
|
||||
|
||||
# Create an environment that the two processes can share, with
|
||||
# 20 pages per cache.
|
||||
set c [list 0 [expr $psize * 20 * 3] 3]
|
||||
set dbenv [eval {berkdb_env \
|
||||
-create -lock -home $testdir -cachesize $c} $flags]
|
||||
error_check_good dbenv [is_valid_env $dbenv] TRUE
|
||||
|
||||
# First open and create the file.
|
||||
set db [berkdb_open -env $dbenv -create \
|
||||
-mode 0644 -pagesize $psize -btree $testfile]
|
||||
error_check_good dbopen/RW [is_valid_db $db] TRUE
|
||||
|
||||
set did [open $dict]
|
||||
set txn ""
|
||||
set count 0
|
||||
|
||||
puts "\tMemp003.a: create database"
|
||||
set keys ""
|
||||
# Here is the loop where we put and get each key/data pair
|
||||
while { [gets $did str] != -1 && $count < $nentries } {
|
||||
lappend keys $str
|
||||
|
||||
set ret [eval {$db put} $txn {$str $str}]
|
||||
error_check_good put $ret 0
|
||||
|
||||
set ret [eval {$db get} $txn {$str}]
|
||||
error_check_good get $ret [list [list $str $str]]
|
||||
|
||||
incr count
|
||||
}
|
||||
close $did
|
||||
error_check_good close [$db close] 0
|
||||
|
||||
# Now open the file for read-only
|
||||
set db [berkdb_open -env $dbenv -rdonly $testfile]
|
||||
error_check_good dbopen/RO [is_substr $db db] 1
|
||||
|
||||
puts "\tMemp003.b: verify a few keys"
|
||||
# Read and verify a couple of keys; saving them to check later
|
||||
set testset ""
|
||||
for { set i 0 } { $i < 10 } { incr i } {
|
||||
set ndx [berkdb random_int 0 [expr $nentries - 1]]
|
||||
set key [lindex $keys $ndx]
|
||||
if { [lsearch $testset $key] != -1 } {
|
||||
incr i -1
|
||||
continue;
|
||||
}
|
||||
|
||||
# The remote process stuff is unhappy with
|
||||
# zero-length keys; make sure we don't pick one.
|
||||
if { [llength $key] == 0 } {
|
||||
incr i -1
|
||||
continue
|
||||
}
|
||||
|
||||
lappend testset $key
|
||||
|
||||
set ret [eval {$db get} $txn {$key}]
|
||||
error_check_good get/RO $ret [list [list $key $key]]
|
||||
}
|
||||
|
||||
puts "\tMemp003.c: retrieve and modify keys in remote process"
|
||||
# Now open remote process where we will open the file RW
|
||||
set f1 [open |$tclsh_path r+]
|
||||
puts $f1 "source $test_path/test.tcl"
|
||||
puts $f1 "flush stdout"
|
||||
flush $f1
|
||||
|
||||
set c [concat "{" [list 0 [expr $psize * 20 * 3] 3] "}" ]
|
||||
set remote_env [send_cmd $f1 \
|
||||
"berkdb_env -create -lock -home $testdir -cachesize $c $flags"]
|
||||
error_check_good remote_dbenv [is_valid_env $remote_env] TRUE
|
||||
|
||||
set remote_db [send_cmd $f1 "berkdb_open -env $remote_env $testfile"]
|
||||
error_check_good remote_dbopen [is_valid_db $remote_db] TRUE
|
||||
|
||||
foreach k $testset {
|
||||
# Get the key
|
||||
set ret [send_cmd $f1 "$remote_db get $k"]
|
||||
error_check_good remote_get $ret [list [list $k $k]]
|
||||
|
||||
# Now replace the key
|
||||
set ret [send_cmd $f1 "$remote_db put $k $k$k"]
|
||||
error_check_good remote_put $ret 0
|
||||
}
|
||||
|
||||
puts "\tMemp003.d: verify changes in local process"
|
||||
foreach k $testset {
|
||||
set ret [eval {$db get} $txn {$key}]
|
||||
error_check_good get_verify/RO $ret [list [list $key $key$key]]
|
||||
}
|
||||
|
||||
puts "\tMemp003.e: Fill up the cache with dirty buffers"
|
||||
foreach k $testset {
|
||||
# Now rewrite the keys with BIG data
|
||||
set data [replicate $alphabet 32]
|
||||
set ret [send_cmd $f1 "$remote_db put $k $data"]
|
||||
error_check_good remote_put $ret 0
|
||||
}
|
||||
|
||||
puts "\tMemp003.f: Get more pages for the read-only file"
|
||||
dump_file $db $txn $t1 nop
|
||||
|
||||
puts "\tMemp003.g: Sync from the read-only file"
|
||||
error_check_good db_sync [$db sync] 0
|
||||
error_check_good db_close [$db close] 0
|
||||
|
||||
set ret [send_cmd $f1 "$remote_db close"]
|
||||
error_check_good remote_get $ret 0
|
||||
|
||||
# Close the environment both remotely and locally.
|
||||
set ret [send_cmd $f1 "$remote_env close"]
|
||||
error_check_good remote:env_close $ret 0
|
||||
close $f1
|
||||
|
||||
reset_env $dbenv
|
||||
}
|
||||
Reference in New Issue
Block a user