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
|
# See the file LICENSE for redistribution information.
#
# Copyright (c) 1996, 2013 Oracle and/or its affiliates. All rights reserved.
#
# $Id$
#
# TEST dead001
# TEST Use two different configurations to test deadlock detection among a
# TEST variable number of processes. One configuration has the processes
# TEST deadlocked in a ring. The other has the processes all deadlocked on
# TEST a single resource.
proc dead001 { { procs "2 4 10" } {tests "ring clump" } \
{timeout 0} {tnum "001"} {pri 0} } {
source ./include.tcl
global lock_curid
global lock_maxid
if {$timeout > 0 && $pri > 0} {
puts "Dead$tnum: Both timeout and priority cannot be set."
return
}
set msg ""
if { $pri == 1 } {
set msg " with priority"
}
puts "Dead$tnum: Deadlock detector tests timeout $timeout"
env_cleanup $testdir
# Create the environment.
puts "\tDead$tnum.a: creating environment"
set env [berkdb_env -create \
-mode 0644 -lock -lock_timeout $timeout -home $testdir]
error_check_good lock_env:open [is_valid_env $env] TRUE
foreach t $tests {
foreach n $procs {
if {$timeout == 0 } {
set dpid [exec $util_path/db_deadlock -v -t 0.100000 \
-h $testdir >& $testdir/dd.out &]
} else {
set dpid [exec $util_path/db_deadlock -v -t 0.100000 \
-ae -h $testdir >& $testdir/dd.out &]
}
sentinel_init
set pidlist ""
set ret [$env lock_id_set $lock_curid $lock_maxid]
error_check_good lock_id_set $ret 0
# Fire off the tests
puts "\tDead$tnum: $n procs of test $t $msg"
for { set i 0 } { $i < $n } { incr i } {
set locker [$env lock_id]
if {$pri == 1} {
$env lock_set_priority $locker $i
}
puts "$tclsh_path $test_path/wrap.tcl \
ddscript.tcl $testdir/dead$tnum.log.$i \
$testdir $t $locker $i $n"
set p [exec $tclsh_path $test_path/wrap.tcl \
ddscript.tcl $testdir/dead$tnum.log.$i \
$testdir $t $locker $i $n &]
lappend pidlist $p
}
watch_procs $pidlist 5
# Now check output
# dead: the number of aborted lockers
# clean: the number of non-aborted lockers
# killed: the highest aborted locker
# kept: the highest non-aborted locker
# In a ring, only one locker is aborted. If testing
# priorities, it should be 0, the lowest priority.
# In a clump, only one locker is not aborted. If testing
# priorities, it should be n, the highest priority.
set dead 0
set clean 0
set other 0
set killed $n
set kept $n
for { set i 0 } { $i < $n } { incr i } {
set did [open $testdir/dead$tnum.log.$i]
while { [gets $did val] != -1 } {
# If the line comes from the
# profiling tool, ignore it.
if { [string first \
"profiling:" $val] == 0 } {
continue
}
switch $val {
DEADLOCK {
incr dead
set killed $i
}
1 {
incr clean
set kept $i
}
default { incr other }
}
}
close $did
}
tclkill $dpid
puts "\tDead$tnum: dead check..."
dead_check $t $n $timeout $dead $clean $other
if {$pri == 1} {
if {$t == "ring"} {
# Only the lowest priority killed in a
# ring
error_check_good low_priority_killed \
$killed 0
} elseif {$t == "clump"} {
# All but the highest priority killed in a
# clump
error_check_good high_priority_kept \
$kept [expr $n - 1]
}
}
}
}
# Windows needs files closed before deleting files, so pause a little
tclsleep 3
fileremove -f $testdir/dd.out
# Remove log files
for { set i 0 } { $i < $n } { incr i } {
fileremove -f $testdir/dead$tnum.log.$i
}
error_check_good lock_env:close [$env close] 0
}
|