Strange DRb and fork issues

Discussion in 'Ruby' started by Farrel Lifson, Apr 29, 2007.

  1. ------=_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
     
    Farrel Lifson, Apr 29, 2007
    #1
    1. Advertising

  2. 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/slave/slave-1.2.1/README

    Cheers-
    -- Ezra Zygmuntowicz
    -- Lead Rails Evangelist
    --
    -- Engine Yard, Serious Rails Hosting
    -- (866) 518-YARD (9273)
     
    Ezra Zygmuntowicz, Apr 29, 2007
    #2
    1. Advertising

  3. On 29/04/07, Ezra Zygmuntowicz <> 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
     
    Farrel Lifson, Apr 29, 2007
    #3
  4. Farrel Lifson

    Guest

    On Mon, 30 Apr 2007, Farrel Lifson wrote:

    > On 29/04/07, Ezra Zygmuntowicz <> 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
     
    , Apr 29, 2007
    #4
  5. On 30/04/07, <> 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
     
    Farrel Lifson, Apr 30, 2007
    #5
  6. Farrel Lifson

    Guest

    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
     
    , Apr 30, 2007
    #6
  7. On 30/04/07, <> 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
     
    Farrel Lifson, Apr 30, 2007
    #7
  8. Farrel Lifson

    Ara.T.Howard Guest

    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
     
    Ara.T.Howard, Apr 30, 2007
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Eric Snow

    os.fork and pty.fork

    Eric Snow, Jan 8, 2009, in forum: Python
    Replies:
    0
    Views:
    599
    Eric Snow
    Jan 8, 2009
  2. Miles Keaton
    Replies:
    3
    Views:
    197
    Miles Keaton
    Mar 30, 2005
  3. Kirk Haines

    More DRb; SSL & DRB & errors

    Kirk Haines, Jul 1, 2005, in forum: Ruby
    Replies:
    0
    Views:
    144
    Kirk Haines
    Jul 1, 2005
  4. J. Wook
    Replies:
    16
    Views:
    300
    Robert Klemme
    May 16, 2007
  5. Ittay Dror
    Replies:
    1
    Views:
    150
    Ittay Dror
    Oct 21, 2008
Loading...

Share This Page