[erlang-bugs] Deadlocking application_controller using init:stop/1, 2

Magnus Ottenklinger magnus.ottenklinger@REDACTED
Fri Sep 5 09:10:36 CEST 2014


Hey List,



I sent  the following mail yesterday, but it seems that the mail was lost in space. Apologies if this reaches you twice.



Magnus



-----



We encountered a deadlock-problem with Erlang's application mechanism in at least R16B01 and OTP 17. Namely, when using init:stop/0,1, a certain order of events can deadlock the application_controller, leaving the VM running. This can be mitigated using the Kernel application's shutdown_timeout, but we think that this would just be a workaround and not a good fix.



Consider the following simple (and contrived) example:



-module(simple_app).



-behaviour(application).



-export([start/2,

         stop/1]).



start(_Type=normal, _Args) ->

    {ok,self()}.



stop(_State) ->

    application:load(crypto), %% yes, this is a bad idea.

    ok.



Compile and run the example:



1> make:all([load]).

up_to_date

2> application:start(simple).

ok

3> init:stop().

ok

4>



After this, application_controller will wait for simple_app to shutdown, whereas simple_app waits for the application_controller. Calls like application:which_applications/0 will time out.



Note that we encountered the problem above in a more complicated setting: while starting our system, we received init:stop/0,1 from user interaction with the shell. As some processes were still starting up (and calling application:load/1 in that process), we got stuck in a VM which could not stop itself using init:stop/0,1 anymore.



I propose that application:load/1,2 (and probably application:unload/1,2 as well) should return {error,shutting_down} if the application_controller is currently shutting down. For this, the application_controller should be able to reply to application:load_application/1 within its blocking receive in application:terminate/2.



Of course, as mentioned above, using shutdown_timeout would be possible, but that might crash applications unnecessarily when they would be able to shutdown nicely.





Regards, Magnus

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20140905/99b30486/attachment.htm>


More information about the erlang-bugs mailing list