Bug #8203
Rinda: recycled object
Description
test-allで以下のメッセージが出ているんですが、これってなんですか?
http://u32.rubyci.org/~chkbuild/ruby-trunk/log/20130402T010302Z.log.html.gz#test-all
Rinda::TupleSpaceProxyTest#test_take_bug_8215 = /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:369:in _id2ref': 0xda91ca76 is recycled object (RangeError)
to_obj'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:369:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1446:in to_obj'
to_obj'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1748:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1025:in _load'
load'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:590:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:590:in block in load'
synchronize'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:586:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:586:in load'
recv_reply'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:638:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:936:in recv_reply'
send_message'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1222:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1110:in block (2 levels) in method_missing'
open'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1197:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1109:in block in method_missing'
with_friend'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1132:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1108:in method_missing'
write'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/rinda/rinda.rb:265:in
from /home/chkbuild/build/20130402T010302Z/ruby/test/rinda/test_rinda.rb:506:in block in test_take_bug_8215'
fork'
from /home/chkbuild/build/20130402T010302Z/ruby/test/rinda/test_rinda.rb:502:in
from /home/chkbuild/build/20130402T010302Z/ruby/test/rinda/test_rinda.rb:502:in test_take_bug_8215'
run_test'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:858:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1301:in run'
run'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit/testcase.rb:17:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:919:in block in _run_suite'
map'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:912:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:912:in _run_suite'
block in _run_suites'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:657:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:655:in each'
_run_suites'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:655:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:867:in _run_anything'
run_tests'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1060:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1047:in block in _run'
each'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1046:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1046:in _run'
run'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1035:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:21:in run'
run'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:774:in
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:834:in run'
run'
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:838:in
from ./test/runner.rb:17:in `'
1.42 s = .
Updated by nagachika (Tomoyuki Chikanaga) almost 8 years ago
おそらくですが、DRb.here? が誤判定していてリモートのオブジェクト(TupleEntry)の参照をカレントプロセス(子プロセス)のオブジェクトと思って object_id から ObjectSpace._id2ref でオブジェクト参照にしようとしてエラーになっているのではないかと。
DRb.here? の誤判定は一度親プロセスで DRb.start_service してから fork しているからかなって気がしますが、再現していないので確認できてないです。main thread の Thread#[] の変数の内容は fork しても引き継がれるようなのでこのせいかなぁ。
Updated by nagachika (Tomoyuki Chikanaga) almost 8 years ago
再現しないと書きましたが、実は DRb.here? の誤判定は起きていて _id2ref でたまたま同じ object_id のオブジェクトがあったのでエラーにならず、また TupleSpace#write の戻り値を利用していないので問題が起きていないだけみたいでした。
やっぱり DRb.current_server で Thread.current["DRb"]["server"] に親プロセスの DRbServer が入ってしまっているようです。