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
This commit is contained in:
nobu 2014-01-18 09:38:22 +00:00
Родитель 0ddcb9489e
Коммит aef778b4e7
1 изменённых файлов: 49 добавлений и 34 удалений

Просмотреть файл

@ -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)
with_timeout(10) {_test_do_reply}
end
tl0 << th
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