Bug #377
closedRinda has a race condition
Description
=begin
咳といいます。
On 2008/07/27, at 22:34, Yusuke ENDOH wrote:
どちらにせよ、1.8のtuplespace.rbを1.9へ
ciしようと思いますので、
よかったらあとでもう一度ためしてもらえますか?
#いまビルド中なのでしばらく待ってください確認しました。
make test-all TESTS=rinda では 0F0E でしたが、make test-
all だと
2 つ Failure が出ました。
failureはたぶんテストの問題です。
1.8系でも遅いマシンで現象を確認しました。
なんとかしたいと思います。
また、この start_keeper だと keeper が死なない
と思うのですが、
それはちょっとまずくないでしょうか。
$ ./ruby -e '
at_exit { sleep 5; p Thread.list }
require "test/rinda/test_rinda.rb"
'Loaded suite -e
Started
.........................
Finished in 1.050015839 seconds.25 tests, 292 assertions, 0 failures, 0 errors
[#<Thread:0x819f2f0 run>, #<Thread:0x838f1a0 sleep>,
#<Thread:0x8389dcc sleep>, #<Thread:0x83a2db8 sleep>,
#<Thread:0x839d520 sleep>, #<Thread:0x83919a0 sleep>,
#<Thread:0x832dd9c sleep>, #<Thread:0x826e67c sleep>,
#<Thread:0x83888f0 sleep>, #<Thread:0x825ebb4 sleep>,
#<Thread:0x825ccd8 sleep>, #<Thread:0x849d038 sleep>,
#<Thread:0x82f3214 sleep>, #<Thread:0x8311ac0 sleep>,
#<Thread:0x845f328 sleep>, #<Thread:0x84be5bc sleep>,
#<Thread:0x847b938 sleep>, #<Thread:0x84265a0 sleep>,
#<Thread:0x824f7b8 sleep>, #<Thread:0x828cf00 sleep>]
これは迷ったんだけど、いまはそうしました。
実アプリケーションではTupleSpaceを使い捨てないと想定し
たからです。
keeperをうまく生成できなかったのは私のプログラミング能力の問
題です。
もうちょっとがんばってみます。
タプルごとにThreadを生成してしまうのが一番簡単なんだけど‥¶
=end
Updated by mame (Yusuke Endoh) over 16 years ago
=begin
遠藤です。
2008/07/29 4:10 Masatoshi SEKI m_seki@mva.biglobe.ne.jp:
また、この start_keeper だと keeper が死なないと思うのですが、
それはちょっとまずくないでしょうか。
(snip)これは迷ったんだけど、いまはそうしました。
実アプリケーションではTupleSpaceを使い捨てないと想定したからです。
うーん、妙にスレッドが残るのは他のテストへの影響がちょっと心配です。
今のところ大丈夫みたいですけど。あとやっぱり少し気持ち悪いです。
せめて、keeper を明示的に終わらせる API を提供するのはどうでしょう。
もちろん keeper がうまく管理できれば、それが一番いいと思います。
Index: lib/rinda/tuplespace.rb¶
--- lib/rinda/tuplespace.rb (revision 18257)
+++ lib/rinda/tuplespace.rb (working copy)
@@ -446,6 +446,16 @@
end
##
-
Finalize this TupleSpace. After TupleSpace is finalized, it should not¶
-
be used.¶
-
def finalize
-
if @keeper && @keeper.alive?
-
@keeper.kill
-
@keeper.join
-
end
-
end
-
Adds +tuple+¶
def write(tuple, sec=nil)
Index: test/rinda/test_rinda.rb
===================================================================
--- test/rinda/test_rinda.rb (revision 18257)
+++ test/rinda/test_rinda.rb (working copy)
@@ -518,6 +518,10 @@
ThreadGroup.new.add(Thread.current)
@ts (Thomas Sondergaard) = Rinda::TupleSpace.new(1)
end -
def teardown
-
@ts.finalize
-
end
end
class TupleSpaceProxyTest < Test::Unit::TestCase
@@ -529,6 +533,10 @@
@ts (Thomas Sondergaard) = Rinda::TupleSpaceProxy.new(@ts_base)
end
- def teardown
- @ts_base.finalize
- end
- def test_remote_array_and_hash
@ts.write(DRbObject.new([1, 2, 3]))
assert_equal([1, 2, 3], @ts.take([1, 2, 3], 0))
--
Yusuke ENDOH mame@tsg.ne.jp
=end
Updated by matz (Yukihiro Matsumoto) over 16 years ago
- Status changed from Open to Rejected
=begin
#376と重複
=end
Updated by mame (Yusuke Endoh) over 16 years ago
=begin
遠藤です。
2008/07/29 4:10 Masatoshi SEKI m_seki@mva.biglobe.ne.jp:
また、この start_keeper だと keeper が死なないと思うのですが、
それはちょっとまずくないでしょうか。
(snip)これは迷ったんだけど、いまはそうしました。
実アプリケーションではTupleSpaceを使い捨てないと想定したからです。
うーん、妙にスレッドが残るのは他のテストへの影響がちょっと心配です。
今のところ大丈夫みたいですけど。あとやっぱり少し気持ち悪いです。
せめて、keeper を明示的に終わらせる API を提供するのはどうでしょう。
もちろん keeper がうまく管理できれば、それが一番いいと思います。
Index: lib/rinda/tuplespace.rb¶
--- lib/rinda/tuplespace.rb (revision 18257)
+++ lib/rinda/tuplespace.rb (working copy)
@@ -446,6 +446,16 @@
end
##
-
Finalize this TupleSpace. After TupleSpace is finalized, it should not¶
-
be used.¶
-
def finalize
-
if @keeper && @keeper.alive?
-
@keeper.kill
-
@keeper.join
-
end
-
end
-
Adds +tuple+¶
def write(tuple, sec=nil)
Index: test/rinda/test_rinda.rb
===================================================================
--- test/rinda/test_rinda.rb (revision 18257)
+++ test/rinda/test_rinda.rb (working copy)
@@ -518,6 +518,10 @@
ThreadGroup.new.add(Thread.current)
@ts (Thomas Sondergaard) = Rinda::TupleSpace.new(1)
end -
def teardown
-
@ts.finalize
-
end
end
class TupleSpaceProxyTest < Test::Unit::TestCase
@@ -529,6 +533,10 @@
@ts (Thomas Sondergaard) = Rinda::TupleSpaceProxy.new(@ts_base)
end
- def teardown
- @ts_base.finalize
- end
- def test_remote_array_and_hash
@ts.write(DRbObject.new([1, 2, 3]))
assert_equal([1, 2, 3], @ts.take([1, 2, 3], 0))
--
Yusuke ENDOH mame@tsg.ne.jp
=end