[erlang-bugs] Supervisor.erl erroreously removes the child_spec on reaching max_restart_intensity

Matthew Sackman <>
Fri Aug 20 17:42:43 CEST 2010


Hello? Anyone out there who looks after supervisor?

On Mon, Aug 09, 2010 at 04:41:12PM +0100, Matthew Sackman wrote:
> It doesn't actually cause a crash, but in the following:
> 
> restart(Child, State) ->
>     case add_restart(State) of
> 	{ok, NState} ->
> 	    restart(NState#state.strategy, Child, NState, fun restart/2);
> 	{terminate, NState} ->
> 	    report_error(shutdown, reached_max_restart_intensity,
> 			 Child, State#state.name),
> 	    {shutdown, remove_child(Child, NState)}
>     end.
> 
> the call to remove_child is wrong. It removes the child spec. In the
> case of a simple_one_for_one, that then means that in terminate, we have
> a pid in the dynamics dictionary, but no child spec at all, whilst in
> the case of non simple_one_for_one the spec is simply not there.
> 
> This doesn't cause any crashes, but it means the state is inconsistent
> in the subsequent terminate function. It should be a call to
> state_del_child (blank the child pid in the non-simple case, or remove
> the pid from the dynamics dict for the simple case).
> 
> Matthew
> 
> ________________________________________________________________
> erlang-bugs (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:
> 


More information about the erlang-bugs mailing list