summaryrefslogtreecommitdiff
path: root/test/rinda
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-01-18 09:38:22 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-01-18 09:38:22 +0000
commitaef778b4e76e768941a790a5e8370b86ec6ac27f (patch)
tree23de39469c73ef5566ec0529a9c762ed2d372b03 /test/rinda
parent0ddcb9489ec40b8b59ec3026c245f2fe1b83e2c2 (diff)
test_rinda.rb: hungup investigation
* test/rinda/test_rinda.rb (with_timeout, wait_for): extract to investigate test_do_reply_local too. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44636 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/rinda')
-rw-r--r--test/rinda/test_rinda.rb83
1 files changed, 49 insertions, 34 deletions
diff --git a/test/rinda/test_rinda.rb b/test/rinda/test_rinda.rb
index 04a8727ff67..f5472d28acf 100644
--- a/test/rinda/test_rinda.rb
+++ b/test/rinda/test_rinda.rb
@@ -559,17 +559,10 @@ class TestRingServer < Test::Unit::TestCase
end
def test_do_reply
- aoe = Thread.abort_on_exception
- Thread.abort_on_exception = true
- tl0 = Thread.list
- tl = nil
- th = Thread.new(Thread.current) do |mth|
- sleep 1
- (tl = Thread.list - tl0).each {|t|t.raise(Timeout::Error)}
- mth.raise(Timeout::Error)
- end
- tl0 << th
+ with_timeout(10) {_test_do_reply}
+ end
+ def _test_do_reply
called = nil
callback = proc { |ts|
@@ -582,34 +575,16 @@ class TestRingServer < Test::Unit::TestCase
@rs.do_reply
- t = 10 + Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
- until called
- if t < Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
- flunk "timeout during waiting call"
- end
- sleep 0.1
- end
+ wait_for(10) {called}
assert_same @ts, called
- rescue Timeout::Error => e
- if tl
- bt = e.backtrace
- tl.each do |t|
- begin
- t.value
- rescue Timeout::Error => e
- bt.unshift("")
- bt[0, 0] = e.backtrace
- end
- end
- end
- raise Timeout::Error, "timeout", bt
- ensure
- th.kill if th
- Thread.abort_on_exception = aoe
end
def test_do_reply_local
+ with_timeout(10) {_test_do_reply_local}
+ end
+
+ def _test_do_reply_local
called = nil
callback = proc { |ts|
@@ -620,7 +595,7 @@ class TestRingServer < Test::Unit::TestCase
@rs.do_reply
- Thread.pass until called
+ wait_for(10) {called}
assert_same @ts, called
end
@@ -707,6 +682,46 @@ class TestRingServer < Test::Unit::TestCase
assert_nil(@rs.do_reply, 'otherwise should hang forever')
end
+ private
+
+ def with_timeout(n)
+ aoe = Thread.abort_on_exception
+ Thread.abort_on_exception = true
+ tl0 = Thread.list
+ tl = nil
+ th = Thread.new(Thread.current) do |mth|
+ sleep n
+ (tl = Thread.list - tl0).each {|t|t.raise(Timeout::Error)}
+ mth.raise(Timeout::Error)
+ end
+ tl0 << th
+ rescue Timeout::Error => e
+ if tl
+ bt = e.backtrace
+ tl.each do |t|
+ begin
+ t.value
+ rescue Timeout::Error => e
+ bt.unshift("")
+ bt[0, 0] = e.backtrace
+ end
+ end
+ end
+ raise Timeout::Error, "timeout", bt
+ ensure
+ th.kill if th
+ Thread.abort_on_exception = aoe
+ end
+
+ def wait_for(n)
+ t = n + Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
+ until yield
+ if t < Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
+ flunk "timeout during waiting call"
+ end
+ sleep 0.1
+ end
+ end
end
class TestRingFinger < Test::Unit::TestCase