[Ruby 1.9 - Bug #5104][Open] test rinda.rb の GC保護もれ

Issue #5104 has been reported by Tomoyuki C…


Bug #5104: test_rinda.rb の GC保護もれ

Author: Tomoyuki C.
Status: Open
Priority: Normal
Assignee: Masatoshi Seki
Category: test
Target version: 1.9.x
ruby -v: ruby 1.9.4dev (2011-07-26 trunk 32672) [i686-linux]

make test-all TESTS=“–gc-stress -vq rinda/test_rinda.rb -n
test_remote_array_and_hash”
と GC.stress = true で rinda のテストを通すと環境によって以下のように失敗します。

Rinda::TupleSpaceProxyTest#test_remote_array_and_hash = 4.62 s = E

Finished tests in 4.626161s, 0.2162 tests/s, 0.0000 assertions/s.

  1. Error:
    test_remote_array_and_hash(Rinda::TupleSpaceProxyTest):
    NoMethodError: undefined method size' for nil:NilClass /home/chikanaga/opt/ruby-trunk/src/ruby/test/rinda/test_rinda.rb:542:in test_remote_array_and_hash’
    …/ruby/test/runner.rb:15:in `’

1 tests, 0 assertions, 0 failures, 1 errors, 0 skips

これはおそらくテストが悪くて、DRbObject は渡されたオブジェクトへの参照を保持せず object_id だけ持つので
参照されるオブジェクトが GC されないようにしないといけないと思います。どうでしょうか。
以下のようにローカル変数に格納して保護すれば OK になりました。

diff --git a/test/rinda/test_rinda.rb b/test/rinda/test_rinda.rb
index b69b63a…f113777 100644
— a/test/rinda/test_rinda.rb
+++ b/test/rinda/test_rinda.rb
@@ -539,9 +539,11 @@ class TupleSpaceProxyTest < Test::Unit::TestCase
end

def test_remote_array_and_hash

  • @ts.write(DRbObject.new([1, 2, 3]))
  • ary = [1, 2, 3]
  • @ts.write(DRbObject.new(ary))
    assert_equal([1, 2, 3], @ts.take([1, 2, 3], 0))
  • @ts.write(DRbObject.new({‘head’ => 1, ‘tail’ => 2}))
  • hsh = {‘head’ => 1, ‘tail’ => 2}
  • @ts.write(DRbObject.new(hsh))
    assert_equal({‘head’ => 1, ‘tail’ => 2},
    @ts.take({‘head’ => 1, ‘tail’ => 2}, 0))
    end

$B31$H$$$$$^$9!#(B

On 2011/07/27, at 12:34, Tomoyuki C. wrote:

Assignee: Masatoshi Seki

$B$3$l$O$$=$i$/%F%9%H$,0-$/$F!"(BDRbObject
$B$OEO$5$l$?%
%V%8%’%/%H$X$N;2>H$rJ];}$;$:(B object_id $B$@$1;}$D$N$G(B
$B;2>H$5$l$k%*%V%8%’%/%H$,(B GC
$B$5$l$J$$$h$&$K$7$J$$$H$$$1$J$$$H;W$$$^$9!#$I$&$G$7$g$&$+!#(B
$B0J2<$N$h$&$K%m!<%+%kJQ?t$K3JG<$7$FJ]8n$9$l$P(B OK $B$K$J$j$^$7$?!#(B

$B$9$_$^$;$s!#$=$N$h$&$K;W$$$^$9!#(B
$B$9$0$K<j$r=P$;$J$$$N$G$I$J$?$+=$@5$7$F$$$?$@$1$J$$$G$7$g$&$+!#(B

$B6a1J$H?=$7$^$9!#(B

$B$9$_$^$;$s!#$=$N$h$&$K;W$$$^$9!#(B
$B$9$0$K<j$r=P$;$J$$$N$G$I$J$?$+=$@5$7$F$$$?$@$1$J$$$G$7$g$&$+!#(B
$B3NG’$"$j$,$H$&$4$6$$$^$9!#(B
$B8eDx$d$C$F$*$-$^$9!#(B

Issue #5104 has been updated by Tomoyuki C…

Status changed from Open to Assigned


Bug #5104: test_rinda.rb の GC保護もれ

Author: Tomoyuki C.
Status: Assigned
Priority: Normal
Assignee: Tomoyuki C.
Category: test
Target version: 1.9.x
ruby -v: ruby 1.9.4dev (2011-07-26 trunk 32672) [i686-linux]

make test-all TESTS=“–gc-stress -vq rinda/test_rinda.rb -n
test_remote_array_and_hash”
と GC.stress = true で rinda のテストを通すと環境によって以下のように失敗します。

Rinda::TupleSpaceProxyTest#test_remote_array_and_hash = 4.62 s = E

Finished tests in 4.626161s, 0.2162 tests/s, 0.0000 assertions/s.

  1. Error:
    test_remote_array_and_hash(Rinda::TupleSpaceProxyTest):
    NoMethodError: undefined method size' for nil:NilClass /home/chikanaga/opt/ruby-trunk/src/ruby/test/rinda/test_rinda.rb:542:in test_remote_array_and_hash’
    …/ruby/test/runner.rb:15:in `’

1 tests, 0 assertions, 0 failures, 1 errors, 0 skips

これはおそらくテストが悪くて、DRbObject は渡されたオブジェクトへの参照を保持せず object_id だけ持つので
参照されるオブジェクトが GC されないようにしないといけないと思います。どうでしょうか。
以下のようにローカル変数に格納して保護すれば OK になりました。

diff --git a/test/rinda/test_rinda.rb b/test/rinda/test_rinda.rb
index b69b63a…f113777 100644
— a/test/rinda/test_rinda.rb
+++ b/test/rinda/test_rinda.rb
@@ -539,9 +539,11 @@ class TupleSpaceProxyTest < Test::Unit::TestCase
end

def test_remote_array_and_hash

  • @ts.write(DRbObject.new([1, 2, 3]))
  • ary = [1, 2, 3]
  • @ts.write(DRbObject.new(ary))
    assert_equal([1, 2, 3], @ts.take([1, 2, 3], 0))
  • @ts.write(DRbObject.new({‘head’ => 1, ‘tail’ => 2}))
  • hsh = {‘head’ => 1, ‘tail’ => 2}
  • @ts.write(DRbObject.new(hsh))
    assert_equal({‘head’ => 1, ‘tail’ => 2},
    @ts.take({‘head’ => 1, ‘tail’ => 2}, 0))
    end

Issue #5104 has been updated by Tomoyuki C…

Assignee changed from Masatoshi Seki to Tomoyuki C.


Bug #5104: test_rinda.rb の GC保護もれ

Author: Tomoyuki C.
Status: Open
Priority: Normal
Assignee: Tomoyuki C.
Category: test
Target version: 1.9.x
ruby -v: ruby 1.9.4dev (2011-07-26 trunk 32672) [i686-linux]

make test-all TESTS=“–gc-stress -vq rinda/test_rinda.rb -n
test_remote_array_and_hash”
と GC.stress = true で rinda のテストを通すと環境によって以下のように失敗します。

Rinda::TupleSpaceProxyTest#test_remote_array_and_hash = 4.62 s = E

Finished tests in 4.626161s, 0.2162 tests/s, 0.0000 assertions/s.

  1. Error:
    test_remote_array_and_hash(Rinda::TupleSpaceProxyTest):
    NoMethodError: undefined method size' for nil:NilClass /home/chikanaga/opt/ruby-trunk/src/ruby/test/rinda/test_rinda.rb:542:in test_remote_array_and_hash’
    …/ruby/test/runner.rb:15:in `’

1 tests, 0 assertions, 0 failures, 1 errors, 0 skips

これはおそらくテストが悪くて、DRbObject は渡されたオブジェクトへの参照を保持せず object_id だけ持つので
参照されるオブジェクトが GC されないようにしないといけないと思います。どうでしょうか。
以下のようにローカル変数に格納して保護すれば OK になりました。

diff --git a/test/rinda/test_rinda.rb b/test/rinda/test_rinda.rb
index b69b63a…f113777 100644
— a/test/rinda/test_rinda.rb
+++ b/test/rinda/test_rinda.rb
@@ -539,9 +539,11 @@ class TupleSpaceProxyTest < Test::Unit::TestCase
end

def test_remote_array_and_hash

  • @ts.write(DRbObject.new([1, 2, 3]))
  • ary = [1, 2, 3]
  • @ts.write(DRbObject.new(ary))
    assert_equal([1, 2, 3], @ts.take([1, 2, 3], 0))
  • @ts.write(DRbObject.new({‘head’ => 1, ‘tail’ => 2}))
  • hsh = {‘head’ => 1, ‘tail’ => 2}
  • @ts.write(DRbObject.new(hsh))
    assert_equal({‘head’ => 1, ‘tail’ => 2},
    @ts.take({‘head’ => 1, ‘tail’ => 2}, 0))
    end