1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
# See the file LICENSE for redistribution information.
#
# Copyright (c) 1996-2002
# Sleepycat Software. All rights reserved.
#
# $Id: memp003.tcl,v 1.1.1.1 2003/11/20 22:13:57 toshok Exp $
#
# TEST memp003
# TEST Test reader-only/writer process combinations; we use the access methods
# TEST for testing.
proc memp003 { } {
#
# 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 -truncate \
-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
}
|