blob: 986fd07958938480f793a19481715a9b6fe40a20 (
plain)
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
|
# See the file LICENSE for redistribution information.
#
# Copyright (c) 1999-2002
# Sleepycat Software. All rights reserved.
#
# $Id: test070.tcl,v 11.27 2002/09/05 17:23:07 sandstro Exp $
#
# TEST test070
# TEST Test of DB_CONSUME (Four consumers, 1000 items.)
# TEST
# TEST Fork off six processes, four consumers and two producers.
# TEST The producers will each put 20000 records into a queue;
# TEST the consumers will each get 10000.
# TEST Then, verify that no record was lost or retrieved twice.
proc test070 { method {nconsumers 4} {nproducers 2} \
{nitems 1000} {mode CONSUME } {start 0} {txn -txn} {tnum 70} args } {
source ./include.tcl
global alphabet
global encrypt
#
# If we are using an env, then skip this test. It needs its own.
set eindex [lsearch -exact $args "-env"]
if { $eindex != -1 } {
incr eindex
set env [lindex $args $eindex]
puts "Test0$tnum skipping for env $env"
return
}
set omethod [convert_method $method]
set args [convert_args $method $args]
if { $encrypt != 0 } {
puts "Test0$tnum skipping for security"
return
}
puts "Test0$tnum: $method ($args) Test of DB_$mode flag to DB->get."
puts "\tUsing $txn environment."
error_check_good enough_consumers [expr $nconsumers > 0] 1
error_check_good enough_producers [expr $nproducers > 0] 1
if { [is_queue $method] != 1 } {
puts "\tSkipping Test0$tnum for method $method."
return
}
env_cleanup $testdir
set testfile test0$tnum.db
# Create environment
set dbenv [eval {berkdb_env -create $txn -home } $testdir]
error_check_good dbenv_create [is_valid_env $dbenv] TRUE
# Create database
set db [eval {berkdb_open -create -mode 0644 -queue}\
-env $dbenv $args $testfile]
error_check_good db_open [is_valid_db $db] TRUE
if { $start != 0 } {
error_check_good set_seed [$db put $start "consumer data"] 0
puts "\tStarting at $start."
} else {
incr start
}
set pidlist {}
# Divvy up the total number of records amongst the consumers and
# producers.
error_check_good cons_div_evenly [expr $nitems % $nconsumers] 0
error_check_good prod_div_evenly [expr $nitems % $nproducers] 0
set nperconsumer [expr $nitems / $nconsumers]
set nperproducer [expr $nitems / $nproducers]
set consumerlog $testdir/CONSUMERLOG.
# Fork consumer processes (we want them to be hungry)
for { set ndx 0 } { $ndx < $nconsumers } { incr ndx } {
set output $consumerlog$ndx
set p [exec $tclsh_path $test_path/wrap.tcl \
conscript.tcl $testdir/conscript.log.consumer$ndx \
$testdir $testfile $mode $nperconsumer $output $tnum \
$args &]
lappend pidlist $p
}
for { set ndx 0 } { $ndx < $nproducers } { incr ndx } {
set p [exec $tclsh_path $test_path/wrap.tcl \
conscript.tcl $testdir/conscript.log.producer$ndx \
$testdir $testfile PRODUCE $nperproducer "" $tnum \
$args &]
lappend pidlist $p
}
# Wait for all children.
watch_procs $pidlist 10
# Verify: slurp all record numbers into list, sort, and make
# sure each appears exactly once.
puts "\tTest0$tnum: Verifying results."
set reclist {}
for { set ndx 0 } { $ndx < $nconsumers } { incr ndx } {
set input $consumerlog$ndx
set iid [open $input r]
while { [gets $iid str] != -1 } {
# Convert high ints to negative ints, to
# simulate Tcl's behavior on a 32-bit machine
# even if we're on a 64-bit one.
if { $str > 0x7fffffff } {
set str [expr $str - 1 - 0xffffffff]
}
lappend reclist $str
}
close $iid
}
set sortreclist [lsort -integer $reclist]
set nitems [expr $start + $nitems]
for { set ndx $start } { $ndx < $nitems } { incr ndx } {
# Convert high ints to negative ints, to simulate
# 32-bit behavior on 64-bit platforms.
if { $ndx > 0x7fffffff } {
set cmp [expr $ndx - 1 - 0xffffffff]
} else {
set cmp [expr $ndx + 0]
}
# Skip 0 if we are wrapping around
if { $cmp == 0 } {
incr ndx
incr nitems
incr cmp
}
# Be sure to convert ndx to a number before comparing.
error_check_good pop_num [lindex $sortreclist 0] $cmp
set sortreclist [lreplace $sortreclist 0 0]
}
error_check_good list_ends_empty $sortreclist {}
error_check_good db_close [$db close] 0
error_check_good dbenv_close [$dbenv close] 0
puts "\tTest0$tnum completed successfully."
}
|