I've been tearing my hair out the last few days trying to track down
a bug in a gem that turns out to live in DRb. The gem is 'reliable-
msg' and it relies on DRb for rpc (I've cc'ed the author too).
I am not a good enough rubyist to track the problem all the way to
its true source, but I do have a simple test case to reproduce the
bug. Plus, there's a simple work around (look at the comments in the
server sample code).
As near as I can tell, this only breaks on OSX (OSX 10.4.6, ruby
1.8.4, DRb 2.0.4).
The error concerns ACL handling and how 127.0.0.1/localhost is
interpreted (maybe an ipv6 prob?). Doing a 'netstat -an|grep 9000'
while the following code is run shows:
tcp6 0 0 ::1.9000 *.*
LISTEN
With apologies to Eric Hodel from whom I borrowed some code, here are
the samples:
------ SERVER --------
#!/usr/bin/env ruby -w
# simple_service.rb
# A simple DRb service
# load DRb
require 'drb'
require 'drb/acl'
# start up the DRb service
DRb.start_service 'druby://localhost:9000',
[],
:tcp_acl => ACL.new('allow 127.0.0.1'.split("
"), ACL::ALLOW_DENY) # <-- causes failure
#:tcp_acl => ACL.new('allow localhost'.split("
"), ACL::ALLOW_DENY) <-- works
# works if you replace 127.0.0.1 with localhost
# wait for the DRb service to finish before exiting
DRb.thread.join
-------------
--------- CLIENT ---------
#!/usr/bin/env ruby -w
# simple_client.rb
# A simple DRb client
require 'drb'
# attach to the DRb server
remote_array = DRbObject.new nil,
'druby://localhost:9000'
puts remote_array.size
remote_array << 1
puts remote_array.size
-------------
The error displayed by the client is:
~/developer/projects/ruby/bugs/drb-acl cremes$ ruby -w
simple_client.rb druby://localhost:9000
/opt/local/lib/ruby/1.8/drb/drb.rb:567:in `load': connection closed
(DRb::DRbConnError)
from /opt/local/lib/ruby/1.8/drb/drb.rb:629:in `recv_reply'
from /opt/local/lib/ruby/1.8/drb/drb.rb:918:in `recv_reply'
from /opt/local/lib/ruby/1.8/drb/drb.rb:1192:in `send_message'
from /opt/local/lib/ruby/1.8/drb/drb.rb:1083:in
`method_missing'
from /opt/local/lib/ruby/1.8/drb/drb.rb:1167:in `open'
from /opt/local/lib/ruby/1.8/drb/drb.rb:1082:in
`method_missing'
from /opt/local/lib/ruby/1.8/drb/drb.rb:1100:in `with_friend'
from /opt/local/lib/ruby/1.8/drb/drb.rb:1081:in
`method_missing'
from simple_client.rb:13