[erlang-questions] gen_server cleanup handling

Bernard Duggan bernie@REDACTED
Wed May 12 02:47:15 CEST 2010


Hi Mazen,
     Our setup kind of has the opposite requirement - if either the 
worker or the gen_server that spawned it crash, both should crash out 
(sorry, that probably wasn't very clear in my initial post).  That's why 
initially a straight spawn_link to create the worker looked so 
attractive - errors propagate between the gen_server and worker, both 
are cleaned up, and the gen_server's supervisor just restarts the 
gen_server (which is what we want).  That, though, would require us to 
handle the EXIT message from the worker in the gen_server if the latter 
turned on trap_exit (which it seems like it needs to).  It's not a huge 
problem, just seems like something we should be able to avoid.

     The alternative we thought of (that I forgot to mention) is that 
this whole mess seems like it could be neatly avoided if supervisors 
also knew how to shutdown their child - I'm thinking an optional extra 
function in the child_spec that is called before the exit(Child, 
shutdown) call is made.  That would allow the gen_server to do its 
cleanup properly and exit with 'stop'.  There may be a very good (or 
historical or both) reason that that doesn't exist, but it seems to me 
to be the 'right' way to solve the problem...maybe.

Cheers,

Bernard

On 11/05/10 16:58, Mazen Harake wrote:
> Spawn your worker processes in a simple_one_for_one supervisor which is
> under your supervisor. This will propagate the exit to the worker
> processes. Use the gen_server under the first Sup to start a worker
> child in the simple_one_for_one Sup.
>
> In other words; Garrett seems to have gotten it right.
>
> This also eliminates point 3 because the crash will not propagate
> through the gen_server.
>
> I'm assuming from your setup that the gen_server doesn't care if the
> worker crashed or not before it finished, otherwise you might as well
> just trap exits and handle all the exit messages anyway without a
> supervisor.
>
> Hope this makes sense; it is morning here and my coffee cup is still
> full (didn't have a chance to drink it yet :))
>
> Good luck
>
> /Mazen
>
> On 11/05/2010 04:58, Bernard Duggan wrote:
>    
>> Hi list,
>>      This is something of a followup to my previous question about
>> supervision trees.  Basically we have a gen_server that, in the case
>> of a standard app shutdown, needs to do some cleanup.  A standard app
>> shutdown seems to take the form of supervisors sending 'shutdown' exit
>> messages to their children.  Fine so far.  The catch is that in order
>> for the terminate() handler to be invoked on our server, we have to
>> turn on trap_exit in every gen_server that needs to do cleanup.  This
>> seems non-ideal for a few reasons:
>>
>> * Elsewhere in the docs, we're cautioned against using trap_exit
>> except when unavoidable (though I'm happy to accept it if this is one
>> such case).
>>
>> * It means that we don't get automatic propagation of crashes from any
>> worker processes we might spawn.  Instead we have to write a
>> handle_info({'EXIT'...) in every gen_server that might ever link to
>> another process to ensure those crashes are propagated properly.  This
>> seems like it could be solved by instead spawning any worker processes
>> as a child of our supervisor (which is what Garrett suggested we
>> should do anyway) - if that's a good reason to set up things that way,
>> I'm likewise happy to accept it and rearrange our code accordingly.
>>
>> * Most concerning, though, is the possibility of some library call
>> creating a link to a temporary worker process (or any process for that
>> matter) whose crash should propagate through us - in this case we'd
>> still have to have the handle_info({'EXIT'...) setup as a catchall
>> which seems like a fiddly, repetitive bit of code we'd rather avoid if
>> possible.
>>
>> So what's the thinking about this?  Am I missing something obvious?
>> Should I just turn on trap_exit willy-nilly wherever I need shutdown
>> cleanup?  Should I just suck it up and write the 'EXIT' message
>> handlers in all such gen_servers?
>>
>> Cheers,
>>
>> Bernard
>>
>> ________________________________________________________________
>> erlang-questions (at) erlang.org mailing list.
>> See http://www.erlang.org/faq.html
>> To unsubscribe; mailto:erlang-questions-unsubscribe@REDACTED
>>
>>      
> ---------------------------------------------------
>
> ---------------------------------------------------
>
> 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