Class Rinda::RingServer
In: rinda/ring.rb
Parent: Object

A RingServer allows a Rinda::TupleSpace to be located via UDP broadcasts. Service location uses the following steps:

  1. A RingServer begins listening on the broadcast UDP address.
  2. A RingFinger sends a UDP packet containing the DRb URI where it will listen for a reply.
  3. The RingServer recieves the UDP packet and connects back to the provided DRb URI with the DRb service.

Methods

Included Modules

DRbUndumped

Public Class methods

Advertises ts on the UDP broadcast address at port.

[Source]

# File rinda/ring.rb, line 32
    def initialize(ts, port=Ring_PORT)
      @ts = ts
      @soc = UDPSocket.open
      @soc.bind('', port)
      @w_service = write_service
      @r_service = reply_service
    end

Public Instance methods

Pulls lookup tuples out of the TupleSpace and sends their DRb object the address of the local TupleSpace.

[Source]

# File rinda/ring.rb, line 82
    def do_reply
      tuple = @ts.take([:lookup_ring, DRbObject])
      Thread.new { tuple[1].call(@ts) rescue nil}
    rescue
    end

Extracts the response URI from msg and adds it to TupleSpace where it will be picked up by reply_service for notification.

[Source]

# File rinda/ring.rb, line 57
    def do_write(msg)
      Thread.new do
        begin
          tuple, sec = Marshal.load(msg)
          @ts.write(tuple, sec)
        rescue
        end
      end
    end

Creates a thread that notifies waiting clients from the TupleSpace.

[Source]

# File rinda/ring.rb, line 70
    def reply_service
      Thread.new do
        loop do
          do_reply
        end
      end
    end

Creates a thread that picks up UDP packets and passes them to do_write for decoding.

[Source]

# File rinda/ring.rb, line 44
    def write_service
      Thread.new do
        loop do
          msg = @soc.recv(1024)
          do_write(msg)
        end
      end
    end

[Validate]