ruby-changes:63367
From: Yusuke <ko1@a...>
Date: Sat, 17 Oct 2020 15:30:26 +0900 (JST)
Subject: [ruby-changes:63367] 5c003b4bcd (master): test/rinda/test_rinda.rb: Prevent a callback Proc from being GC'ed
https://git.ruby-lang.org/ruby.git/commit/?id=5c003b4bcd From 5c003b4bcd70b03012f6d2e322bd175efd226528 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh <mame@r...> Date: Sat, 17 Oct 2020 15:17:55 +0900 Subject: test/rinda/test_rinda.rb: Prevent a callback Proc from being GC'ed According to the log of ac803ab55db50ef891e3680680620d01f28a759b, 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'" ``` https://rubyci.org/logs/rubyci.s3.amazonaws.com/rhel8/ruby-master/log/20201017T033002Z.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. diff --git a/test/rinda/test_rinda.rb b/test/rinda/test_rinda.rb index c20f060..e247635 100644 --- a/test/rinda/test_rinda.rb +++ b/test/rinda/test_rinda.rb @@ -673,11 +673,11 @@ class TestRingServer < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/rinda/test_rinda.rb#L673 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] -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/