mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
test/rinda/test_rinda.rb: Prevent a callback Proc from being GC'ed
According to the log ofac803ab55d
, I found that a thread terminates silently due to "recycled object" of id2ref: ``` "/home/chkbuild/chkbuild/tmp/build/20201017T033002Z/ruby/lib/drb/drb.rb:366:in `_id2ref'" "/home/chkbuild/chkbuild/tmp/build/20201017T033002Z/ruby/lib/drb/drb.rb:366:in `to_obj'" "/home/chkbuild/chkbuild/tmp/build/20201017T033002Z/ruby/lib/drb/drb.rb:1528:in `to_obj'" "/home/chkbuild/chkbuild/tmp/build/20201017T033002Z/ruby/lib/drb/drb.rb:1847:in `to_obj'" "/home/chkbuild/chkbuild/tmp/build/20201017T033002Z/ruby/lib/drb/drb.rb:1136:in `method_missing'" "/home/chkbuild/chkbuild/tmp/build/20201017T033002Z/ruby/test/rinda/test_rinda.rb:652:in `block in do_reply'" ```20201017
T033002Z.log.html.gz I believe that this unintentional thread termination has caused intermittent timeout failure of `TestRingServer#test_do_reply`. The root cause of the "recycled object" issue is a bug of `TestRingServer#test_do_reply`. It creates a callback Proc object but does not hold the reference to the object: ``` callback = DRb::DRbObject.new callback ``` The original "callback" object is GC'ed unintentionally. I could consistently reproduce this issue on my machine by adding `GC.stress = true` at the first of `_test_do_reply` method body. This change uses another local variable name, "callback_orig", to keep the original Proc object.
This commit is contained in:
parent
f6661f5085
commit
5c003b4bcd
1 changed files with 2 additions and 2 deletions
|
@ -673,11 +673,11 @@ class TestRingServer < Test::Unit::TestCase
|
|||
def _test_do_reply
|
||||
called = nil
|
||||
|
||||
callback = proc { |ts|
|
||||
callback_orig = proc { |ts|
|
||||
called = ts
|
||||
}
|
||||
|
||||
callback = DRb::DRbObject.new callback
|
||||
callback = DRb::DRbObject.new callback_orig
|
||||
|
||||
@ts.write [:lookup_ring, callback]
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue