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. |