Rinda::RingFinger.primary broken on 1.9?

The following code correctly errors (with RingNotFound) on Ruby 1.8.6
and 1.8.7, but hangs forever on 1.9.2 and 1.9.3:

require ‘rinda/ring’
DRb.start_service
Rinda::RingFinger.primary

This behavior is consistent on Windows 7 and Linux (both RH 5.6 and
CentOS 5.6). Anyone have an idea what’s going on?

Thanks,
Hubert

Hi, Hubert-san.

Thank you for the report.
It’s my bug.

Please try this patch:

require ‘rinda/ring’

module Rinda
class RingFinger
def lookup_ring_any(timeout=5)
queue = Queue.new

  th = 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?
  while it = queue.pop
    @rings.push(it)
  end

  @primary
end

end
end

DRb.start_service
Rinda::RingFinger.primary

Hi, Hubert-san.

It’s a bug.
I fixed it in svn.

Index: lib/rinda/ring.rb

— lib/rinda/ring.rb (revision 35596)
+++ lib/rinda/ring.rb (working copy)
@@ -203,13 +203,17 @@
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 = queue.pop
    
  •  raise('RingNotFound') if @primary.nil?
     @primary
    
    end

That fixes it! Thanks!

Regards,
Hubert