[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]