Hello, I have been playing with dRuby and am getting strange differences
with
passing DRbUndumped-objects from a client machine to a DIFFERENT server
and
calling methods on this object:
I wrote a small server that basically accepts an object and does
something
with this (calling its instance method “name”):
#server code
require(“drb”)
class Server
def receiveSomething(job)
puts(“receiving something”)
puts job.name
end
end
DRb.start_service(“druby://:1234”,Server.new)
DRb.thread.join
The client code defines the class “Something” which has the instance
method
“name”. I want to pass an object of class “Something” to the server BY
REFERENCE, so I added “include DRbUndumped” in its definition:
#client code
require(“drb”)
class Something
include DRbUndumped
def name
return “MyName”
end
end
DRb.start_service
server=DRbObject.new(nil,‘druby://localhost:1234’)
server.receiveSomething(Something.new)
All goes well ONLY IF THE SERVER AND THE CLIENT ARE RUN FROM THE SAME
MACHINE:
server output:
receiving something
MyName
If I start the server code on a DIFFERENT machine (same OS (slackware
10.2),
same ruby version (1.8.4)) and replace “localhost” with the server
machine
name in the client code, the server gives as output:
receiving something
and the client crashes with this message:
(druby://ivon:1234) /usr/local/lib/ruby/1.8/drb/drb.rb:733:in open': druby://localhost:32816 - #<Errno::ECONNREFUSED: Connection refused - connect(2)> (DRb::DRbConnError) from (druby://ivon:1234) /usr/local/lib/ruby/1.8/drb/drb.rb:726:in
open’
from (druby://ivon:1234)
/usr/local/lib/ruby/1.8/drb/drb.rb:1186:in
initialize' from (druby://ivon:1234) /usr/local/lib/ruby/1.8/drb/drb.rb:1166:in
open’
from (druby://ivon:1234)
/usr/local/lib/ruby/1.8/drb/drb.rb:1082:in
method_missing' from (druby://ivon:1234) /usr/local/lib/ruby/1.8/drb/drb.rb:1100:in
with_friend’
from (druby://ivon:1234)
/usr/local/lib/ruby/1.8/drb/drb.rb:1081:in
method_missing' from (druby://ivon:1234) as.rb:5:in
receiveSomething’
from (druby://ivon:1234)
/usr/local/lib/ruby/1.8/drb/drb.rb:1552:in
perform_without_block' ... 6 levels... from (druby://ivon:1234) /usr/local/lib/ruby/1.8/drb/drb.rb:1344:in
initialize’
from (druby://ivon:1234)
/usr/local/lib/ruby/1.8/drb/drb.rb:1624:in
`start_service’
from (druby://ivon:1234) as.rb:8
from ac.rb:10
I’ve tested all dRuby examples using DRbUndumped that I could find and
they
all work on one machine, but crash when trying to use them on two
different
machines (what’s the point of having a distributed environment that
works
only on one machine :-)).
My client code CAN find the server correctly when using two different
machines
since it says “receiving something”, so these errors have nothing to do
with
firewall settings or something, problems start when calling methods on
objects that are passed by reference. Maybe there are some ruby security
settings that I have wrong, but I have no clue which ones.
All help is very appreciated, especially with working examples!
Greetings,
Geert F…