blob: 28874568c8be8bfe8f583affbae06a2c086f82f2 (
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
|
# See the file LICENSE for redistribution information.
#
# Copyright (c) 1999-2009 Oracle. All rights reserved.
#
# $Id$
#
# 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 "070"} 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 "Test$tnum skipping for env $env"
return
}
set omethod [convert_method $method]
set args [convert_args $method $args]
if { $encrypt != 0 } {
puts "Test$tnum skipping for security"
return
}
set pageargs ""
split_pageargs $args pageargs
puts "Test$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 Test$tnum for method $method."
return
}
env_cleanup $testdir
set testfile test$tnum.db
# Create environment
set dbenv [eval {berkdb_env -create $txn -home } $testdir $pageargs]
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 "\tTest$tnum: starting 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 "\tTest$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 } {
lappend reclist $str
}
close $iid
}
set sortreclist [lsort -command int32_compare $reclist]
set nitems [expr $start + $nitems]
for { set ndx $start } { $ndx < $nitems } { set ndx [expr $ndx + 1] } {
# Wrap if $ndx goes beyond 32 bits because our
# recno wrapped if it did.
if { $ndx > 0xffffffff } {
set cmp [expr $ndx - 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 "\tTest$tnum completed successfully."
}
|