From: noreply@... Date: 2006-07-31T09:17:25+09:00 Subject: [ ruby-Patches-5244 ] RingServer fails to find a TupleSpace when TupleSpace resides in the same ruby process with RingServer Patches item #5244, was opened at 2006-07-31 00:17 You can respond by visiting: http://rubyforge.org/tracker/?func=detail&atid=1700&aid=5244&group_id=426 Category: Ruby1.8 Group: None Status: Open Resolution: None Priority: 3 Submitted By: Kent Sibilev (kent) Assigned to: Nobody (None) Summary: RingServer fails to find a TupleSpace when TupleSpace resides in the same ruby process with RingServer Initial Comment: This example is a demonstration of the problem: require 'rinda/ring' require 'rinda/tuplespace' DRb.start_service ts = Rinda::TupleSpace.new server = Rinda::RingServer.new(ts) provider = Rinda::RingProvider.new :Whatever, Object.new, 'Whatever' provider.provide DRb.thread.join Below is the patch to fix this problem: Index: lib/rinda/ring.rb =================================================================== RCS file: /src/ruby/lib/rinda/ring.rb,v retrieving revision 1.1.2.2 diff -u -r1.1.2.2 ring.rb --- lib/rinda/ring.rb 24 Oct 2005 15:31:30 -0000 1.1.2.2 +++ lib/rinda/ring.rb 30 Jul 2006 23:58:50 -0000 @@ -80,7 +80,7 @@ # address of the local TupleSpace. def do_reply - tuple = @ts.take([:lookup_ring, DRbObject]) + tuple = @ts.take([:lookup_ring, nil]) Thread.new { tuple[1].call(@ts) rescue nil} rescue end Description: When the RingFinder sends a search request for TupleSpace, RingServer receives it and uses Marshal API to unpack it. Since both RingServer and RingFinder reside in the same process, DRbObject unmarshals itself to the actual Proc object in drb/drb.rb:1009. Note that this used to work correctly in Ruby 1.8.2 because of the bug where Marshal API didn't call DRbObject::_load method during unmarshalling process. ---------------------------------------------------------------------- You can respond by visiting: http://rubyforge.org/tracker/?func=detail&atid=1700&aid=5244&group_id=426