[erlang-questions] runtime code upgrade, process ceases to exist.
Sid Muller
sid5@REDACTED
Fri Oct 2 05:50:44 CEST 2015
Thank you! You are a lifesaver sir!
> Sent: Thursday, October 01, 2015 at 9:29 AM
> From: "Sverker Eriksson" <sverker.eriksson@REDACTED>
> To: "Sid Muller" <sid5@REDACTED>, erlang-questions <erlang-questions@REDACTED>
> Subject: Re: [erlang-questions] runtime code upgrade, process ceases to exist.
>
> Your server function is not tail recursive.
>
> You must do your call to ?MODULE:server()
> tail recursive. Otherwise you leave a return address
> referring to the old code on the call stack. And that is
> why your process gets killed when the old code is purged.
>
> /Sverker
>
> On 10/01/2015 06:08 PM, Sid Muller wrote:
> > Hi,
> >
> > I'm struggling to understand this runtime code upgrade oddity and was hoping someone could shed some light on this issue.
> >
> > The issue that I'm having is that the process running the latest code dies after the code is loaded with l(module) for the second time.
> >
> > I understand that only 2 versions of the software can be running at any given time but what I'm not understanding is why does the process with the latest code die or go away.
> >
> > I have process (a) that runs and calls b:do_stuff() which does stuff and responds back to (a).
> >
> > Module b has an upgrade function that will call into the latest module:
> >
> > upgrade()->
> > Ref = make_ref(),
> > ?SERVER ! {self(), Ref, upgrade},
> > receive
> > {Ref, ok} ->
> > ok
> > end.
> >
> > do_stuff()->
> > Ref = make_ref(),
> > ?SERVER ! {self(), Ref, do_stuff}, %% <-after second l(b) function fails here because ?SERVER is no longer registered, process is gone
> > receive
> > {Ref, ok} ->
> > ok
> > end.
> >
> > server()->
> > receive
> > {Client, Ref, upgrade} ->
> > update_internal_structures(),
> > Client ! {Ref, ok},
> > ?MODULE:server();
> > {Client, Ref, do_stuff} ->
> > do_stuff(),
> > Client ! {Ref, ok}
> > end
> > server().
> >
> >
> > so after I load the new code with l(b). I call b:upgrade() from the shell and I can tell from the output in do_stuff() that new code is running when process a sends us do_stuff message. This is all fine until I make another change to module (b) but when I call l(b) process (b) is wiped out, gone, no more... It's not a crash in process (b), it just ceases to exist. And it's very frustrating because I have exactly the same code in another process which seems to survive multiple l(c) without any issues. The only difference between the two is that process(b) has a link to a dets process because it opens dets files and the link is created by the dets backend I believe.
> >
> > I must not be understanding this hot code upgrade....
> >
> > Can anyone shed any light on this?
> > _______________________________________________
> > erlang-questions mailing list
> > erlang-questions@REDACTED
> > http://erlang.org/mailman/listinfo/erlang-questions
> >
>
>
More information about the erlang-questions
mailing list