[erlang-questions] simple_one_for_one being unjustly supervised?

Ulf Wiger <>
Sun Apr 4 12:48:06 CEST 2010


The relevant code in the application controller (since I
happened to have it open, as I snipped from it earlier today)
is in application_master.erl:

loop_it(Parent, Child, Mod, AppState) ->
     receive
         {Parent, get_child} ->
             Parent ! {self(), Child, Mod},
             loop_it(Parent, Child, Mod, AppState);
         {Parent, terminate} ->
             NewAppState = prep_stop(Mod, AppState),
             exit(Child, shutdown),
             receive
                 {'EXIT', Child, _} -> ok
             end,
             catch Mod:stop(NewAppState),
             exit(normal);

As you can see, the supervisor is terminated using exit(Child,shutdown).
(Child is the pid returned from Mod:start/2).

I have not looked at your logs, nor do I have a good explanation
for the discrepancy you're observing.

BR,
Ulf W


Essien Essien wrote:
> Hi all,
> 
> Maybe I'm missing something pretty obvious, but I'm noticing that the
> children of a simple_one_for_one supervisor are being killed off
> without honoring their "shutdown" interval, when they're taken down by
> a top-level application. Everything work fine if I sent an
> exit(SupPid, shutdown) to the top-level supervisor PID though.
> 
> I have attached a contrived example application called "boss"...
> 
> The application callback and top-level supervisor behaviours are
> implemented in the same module.
> 
> The boss supervisor is a one_for_one supervisor which supervises a
> "nanny", "manage" and "delay" modules.
> 
> "nanny" is a simple_one_for_one supervisor which supervises "children"
> (a gen_server).
> 
> "manage" is a gen_server which spins up the children by calling
> nanny:start_child when it starts up. The number of children is read
> from the boss.app file.
> 
> "delay" is a gen_server which just delays for a configurable amount of
> time before shutting down.
> 
> "children" is a simple gen_server which delays for 5 seconds before
> shutting down.
> 
> From my tests in an erl session, if i do:
> 
> 1 > {ok, Pid} = boss:start_link([8, 5000]). %these arguments mean, 8
> children, 5 seconds delay for the delay gen_server
> 
> And then:
> 
> 2 > exit(Pid, shutdown).
> 
> Everything happens nicely. I see _all_ my logging messages which
> suggests that things cleaned up nice and sweet.
> 
> But if I do:
> 
> 3 > application:start(boss).
> 4 > application:stop(boss).
> 
> ONLY the "delay" module cleans up nicely... I never get to see the
> logs from the "children" instances... which means the tree just kills
> them off very fast.
> 
> 
> Is this a known behaviour? Am I missing something critical?
> 
> Any wisdoms will be much appreciated.
> 
> Also, I tried peeking at the code for supervisor.erl (went all the way
> to do_terminate/2 and shutdown/2) and nothing looks amiss, the code
> for application_controller.erl would take a bit more than a cursory
> glance to trace through all that is happening, so I wanted to ask here
> first, before going any further.
> 
> cheers,
> Essien
> 
> 
> ------------------------------------------------------------------------
> 
> 
> ________________________________________________________________
> erlang-questions (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:


-- 
Ulf Wiger
CTO, Erlang Solutions Ltd, formerly Erlang Training & Consulting Ltd
http://www.erlang-solutions.com
---------------------------------------------------

---------------------------------------------------

WE'VE CHANGED NAMES!

Since January 1st 2010 Erlang Training and Consulting Ltd. has become ERLANG SOLUTIONS LTD.

www.erlang-solutions.com



More information about the erlang-questions mailing list