Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Strange DRb and fork issues

Reply
Thread Tools

Strange DRb and fork issues

 
 
Farrel Lifson
Guest
Posts: n/a
 
      04-29-2007
------=_Part_212249_10342094.1177845441000
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Hi all,

I'm busy experimenting with DRb and I've hit some strange behaviour
which I can't get seem to find the cause of. I think it might be
something to do with DRb and forks but I'm unsure. The process I'm
trying to achieve is to have a Server process running as a DRb
service. It can spawn client processes (the create_client method)
which also run using a DRb service.

Upon spawning the clients create DRb proxy objects to the server and
register using the register_client method passing through their client
process pid and url. The server then creates DRb proxy objects with
the information it receives and stores it in a hash with the client
pid as the key. We can retrieve an array of client pid using the
client_pids method on the server.

I have encountered the following problem. When I start the server
process and then start the client process independent from the server
process everything seems to work fine. I can retrieve from the server
the array of client pids and everything exits gracefully.

However when I create the client from within the server process using
the create_client method (like it hopefully would normally do) the
server registers the client pid and stores it in the hash but on
subsequent calls to get the array of pids it comes back empty(!) and a
ruby process hangs around afterwards. I've attached some files showing
this behaviour. Both tests in theory should be doing the same thing;
registering a client with a server and then retrieving the array of
client pids.

farrel@nicodemus ~/Desktop $ ruby server.rb -n test_register_client
Loaded suite server
Started
Registered client druby://localhost:41362, 1 clients registered
 
Reply With Quote
 
 
 
 
Ezra Zygmuntowicz
Guest
Posts: n/a
 
      04-29-2007

On Apr 29, 2007, at 4:17 AM, Farrel Lifson wrote:

> Hi all,
>
> I'm busy experimenting with DRb and I've hit some strange behaviour
> which I can't get seem to find the cause of. I think it might be
> something to do with DRb and forks but I'm unsure. The process I'm
> trying to achieve is to have a Server process running as a DRb
> service. It can spawn client processes (the create_client method)
> which also run using a DRb service.
>


> <snip>


> Any DRb experts out there who can help?
>
> Thanks
> Farrel
> <base.rb>
> <client.rb>
> <server.rb>



Hey Farrel-

I'll save you a lot of hassle. Go grab the slave gem off rubyforge.
It does exactly what you are trying to do. It allows you to fork
child objects and it sets up a drb connection and a heartneat between
the child and parent so if the parent dies, the children will also die.

http://codeforpeople.com/lib/ruby/sl...e-1.2.1/README

Cheers-
-- Ezra Zygmuntowicz
-- Lead Rails Evangelist
-- http://www.velocityreviews.com/forums/(E-Mail Removed)
-- Engine Yard, Serious Rails Hosting
-- (866) 518-YARD (9273)



 
Reply With Quote
 
 
 
 
Farrel Lifson
Guest
Posts: n/a
 
      04-29-2007
On 29/04/07, Ezra Zygmuntowicz <(E-Mail Removed)> wrote:
> I'll save you a lot of hassle. Go grab the slave gem off rubyforge.
> It does exactly what you are trying to do. It allows you to fork
> child objects and it sets up a drb connection and a heartneat between
> the child and parent so if the parent dies, the children will also die.


Thanks, I'll check it out, although I would really like to work out
what the problem is with my code. I'll look through the source of
Slave and see if I can find some hints.

Farrel

 
Reply With Quote
 
ara.t.howard@noaa.gov
Guest
Posts: n/a
 
      04-29-2007
On Mon, 30 Apr 2007, Farrel Lifson wrote:

> On 29/04/07, Ezra Zygmuntowicz <(E-Mail Removed)> wrote:
>> I'll save you a lot of hassle. Go grab the slave gem off rubyforge.
>> It does exactly what you are trying to do. It allows you to fork
>> child objects and it sets up a drb connection and a heartneat between
>> the child and parent so if the parent dies, the children will also die.

>
> Thanks, I'll check it out, although I would really like to work out what the
> problem is with my code. I'll look through the source of Slave and see if I
> can find some hints.
>


i reccomend trying to using slave.rb if you can - of course, as the author,
i'm biased. it's really tricky connecting parent/child drb processes: the key
is that you cannot carry the drb objects across the fork, you must setup each
new drb object in the child and arrange for the parent to find it. this, as
ezra mentions, exactly what slave does. if you have examle code we can
suggest how to plug slave into it.

regards.

-a
--
be kind whenever possible... it is always possible.
- the dalai lama

 
Reply With Quote
 
Farrel Lifson
Guest
Posts: n/a
 
      04-29-2007
On 30/04/07, (E-Mail Removed) <(E-Mail Removed)> wrote:
> i reccomend trying to using slave.rb if you can - of course, as the author,
> i'm biased. it's really tricky connecting parent/child drb processes: the key
> is that you cannot carry the drb objects across the fork, you must setup each
> new drb object in the child and arrange for the parent to find it. this, as
> ezra mentions, exactly what slave does. if you have examle code we can
> suggest how to plug slave into it.


Hi Ara,

In my code I used fork with a block (taken from server.rb):
def create_client(hostname=nil,port=nil)
pid = fork do
@klass.start(hostname,port,self.url)
end
Process.detach(pid)
pid
end
end

Could that be causing the strange issue I'm having? I assumed that was
a safe way of using fork as the child only runs what's in the block.
My main puzzle is why the server loses it's reference to the client
process after it has registered.

I'm trying to learn some of the low level details of DRb, but
unfortunately the documentation out there is not very detailed.

Farrel

 
Reply With Quote
 
ara.t.howard@noaa.gov
Guest
Posts: n/a
 
      04-30-2007
On Mon, 30 Apr 2007, Farrel Lifson wrote:

>
> Hi Ara,
>
> In my code I used fork with a block (taken from server.rb):
> def create_client(hostname=nil,port=nil)
> pid = fork do
> @klass.start(hostname,port,self.url)
> end
> Process.detach(pid)
> pid
> end
> end


that looks reasonable.

> Could that be causing the strange issue I'm having? I assumed that was a
> safe way of using fork as the child only runs what's in the block. My main
> puzzle is why the server loses it's reference to the client process after it
> has registered.


hard to say without seeing the code

> I'm trying to learn some of the low level details of DRb, but unfortunately
> the documentation out there is not very detailed.


the samples directory covers nearly everything - do you have that?

cheers.

-a
--
be kind whenever possible... it is always possible.
- the dalai lama

 
Reply With Quote
 
Farrel Lifson
Guest
Posts: n/a
 
      04-30-2007
On 30/04/07, (E-Mail Removed) <(E-Mail Removed)> wrote:
> On Mon, 30 Apr 2007, Farrel Lifson wrote:
>
> >
> > Hi Ara,
> >
> > In my code I used fork with a block (taken from server.rb):
> > def create_client(hostname=nil,port=nil)
> > pid = fork do
> > @klass.start(hostname,port,self.url)
> > end
> > Process.detach(pid)
> > pid
> > end
> > end

>
> that looks reasonable.
>
> > Could that be causing the strange issue I'm having? I assumed that was a
> > safe way of using fork as the child only runs what's in the block. My main
> > puzzle is why the server loses it's reference to the client process after it
> > has registered.

>
> hard to say without seeing the code


Hi Ara,

Thanks for the help, I hope you don't mind me badgering you but from
my time on the list I know you are one of the resident DRb experts so
I'm grabbing the opportunity to get some expert advice here.

I attached the code I'm using in my first email, comprising three
files (base.rb, client.rb and server.rb) with the unit tests
illustrating my problems in server.rb . If it got stripped out let me
know and I can try and resend it. In the meantime I will check out the
DRb samples directorty and see if that helps.

Thanks again,
Farrel

 
Reply With Quote
 
Ara.T.Howard
Guest
Posts: n/a
 
      04-30-2007
On Mon, 30 Apr 2007, Farrel Lifson wrote:

>
> Hi Ara,
>
> Thanks for the help, I hope you don't mind me badgering you but from
> my time on the list I know you are one of the resident DRb experts so
> I'm grabbing the opportunity to get some expert advice here.
>
> I attached the code I'm using in my first email, comprising three
> files (base.rb, client.rb and server.rb) with the unit tests
> illustrating my problems in server.rb . If it got stripped out let me
> know and I can try and resend it. In the meantime I will check out the
> DRb samples directorty and see if that helps.
>
> Thanks again,
> Farrel
>


i'll try to look at it soon...

cheers.

-a
--
be kind whenever possible... it is always possible.
- the dalai lama

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
os.fork and pty.fork Eric Snow Python 0 01-08-2009 06:32 AM
DRB: can't run subshell in drb server? Ittay Dror Ruby 1 10-21-2008 11:28 AM
DRb connection error with more than 250+ DRb services J. Wook Ruby 16 05-16-2007 11:32 AM
More DRb; SSL & DRB & errors Kirk Haines Ruby 0 07-01-2005 06:29 PM
DRb / dRuby - freezes on DRb::DRbUndumped - any ideas? Miles Keaton Ruby 3 03-30-2005 03:37 PM



Advertisments