Contain the first advertised TupleSpace after #lookup_ring_any is called.
Support for the Ruby 2.1 series ended on March 31 2017. See here for details.
Object
RingFinger is used by RingServer clients to discover the RingServer's TupleSpace. Typically, all a client needs to do is call ::primary to retrieve the remote TupleSpace, which it can then begin using.
To find the first available remote TupleSpace:
Rinda::RingFinger.primary
To create a RingFinger that broadcasts to a custom list:
rf = Rinda::RingFinger.new ['localhost', '192.0.2.1'] rf.primary
Rinda::RingFinger also understands multicast addresses and sets them up properly. This allows you to run multiple RingServers on the same host:
rf = Rinda::RingFinger.new ['239.0.0.1'] rf.primary
You can set the hop count (or TTL) for multicast searches using multicast_hops.
If you use IPv6 multicast you may need to set both an address and the outbound interface index:
rf = Rinda::RingFinger.new ['ff02::1'] rf.multicast_interface = 1 rf.primary
At this time there is no easy way to get an interface index by name.
Creates a singleton RingFinger and looks for a RingServer. Returns the created RingFinger.
# File rinda/ring.rb, line 282 def self.finger unless @@finger @@finger = self.new @@finger.lookup_ring_any end @@finger end
Creates a new RingFinger that will look for
RingServers at port
on the addresses in
broadcast_list
.
If broadcast_list
contains a multicast address then multicast
queries will be made using the given #multicast_hops and
multicast_interface.
# File rinda/ring.rb, line 338 def initialize(broadcast_list=@@broadcast_list, port=Ring_PORT) @broadcast_list = broadcast_list || ['localhost'] @port = port @primary = nil @rings = [] @multicast_hops = 1 @multicast_interface = 0 end
Returns the first advertised TupleSpace.
# File rinda/ring.rb, line 293 def self.primary finger.primary end
Iterates over all discovered TupleSpaces starting with the primary.
# File rinda/ring.rb, line 358 def each lookup_ring_any unless @primary return unless @primary yield(@primary) @rings.each { |x| yield(x) } end
Looks up RingServers waiting timeout
seconds. RingServers
will be given block
as a callback, which will be called with
the remote TupleSpace.
# File rinda/ring.rb, line 370 def lookup_ring(timeout=5, &block) return lookup_ring_any(timeout) unless block_given? msg = Marshal.dump([[:lookup_ring, DRbObject.new(block)], timeout]) @broadcast_list.each do |it| send_message(it, msg) end sleep(timeout) end
Returns the first found remote TupleSpace.
Any further recovered TupleSpaces can be found by calling
to_a
.
# File rinda/ring.rb, line 384 def lookup_ring_any(timeout=5) queue = Queue.new Thread.new do self.lookup_ring(timeout) do |ts| queue.push(ts) end queue.push(nil) end @primary = queue.pop raise('RingNotFound') if @primary.nil? Thread.new do while it = queue.pop @rings.push(it) end end @primary end