]> granicus.if.org Git - ejabberd/commitdiff
Don't produce a crash dump during intentional exit
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Thu, 29 Mar 2018 09:14:31 +0000 (12:14 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Thu, 29 Mar 2018 09:14:31 +0000 (12:14 +0300)
Also halt faster without relying on timeouts for buffers flushing

src/ejabberd.erl
src/ejabberd_app.erl
src/ejabberd_config.erl
src/gen_mod.erl
src/pubsub_migrate.erl

index 356fd66c7fdbac63b6a17a50390d5de553a38e19..4740bd034e0c9f12c1e2566e5db6be0f1de7444b 100644 (file)
@@ -25,6 +25,7 @@
 
 -module(ejabberd).
 -author('alexey@process-one.net').
+-compile({no_auto_import, [{halt, 0}]}).
 
 -protocol({xep, 4, '2.9'}).
 -protocol({xep, 86, '1.0'}).
@@ -36,7 +37,7 @@
 -protocol({xep, 243, '1.0'}).
 -protocol({xep, 270, '1.0'}).
 
--export([start/0, stop/0, start_app/1, start_app/2,
+-export([start/0, stop/0, halt/0, start_app/1, start_app/2,
         get_pid_file/0, check_app/1, module_name/1]).
 
 -include("logger.hrl").
@@ -49,6 +50,11 @@ stop() ->
     application:stop(ejabberd).
     %%ejabberd_cover:stop().
 
+halt() ->
+    application:stop(lager),
+    application:stop(sasl),
+    erlang:halt(1, [{flush, true}]).
+
 %% @spec () -> false | string()
 get_pid_file() ->
     case os:getenv("EJABBERD_PID_PATH") of
@@ -131,8 +137,7 @@ exit_or_halt(Reason, StartFlag) ->
     ?CRITICAL_MSG(Reason, []),
     if StartFlag ->
             %% Wait for the critical message is written in the console/log
-            timer:sleep(1000),
-            halt(string:substr(lists:flatten(Reason), 1, 199));
+            halt();
        true ->
             erlang:error(application_start_failed)
     end.
index a7e03d990949f5c8d2299e0d805004a6f44ec52c..f1066815fa09671232160de878e09cfdc8a3b85b 100644 (file)
@@ -62,8 +62,7 @@ start(normal, _Args) ->
            {ok, SupPid};
        Err ->
            ?CRITICAL_MSG("Failed to start ejabberd application: ~p", [Err]),
-           timer:sleep(1000),
-           halt("Refer to ejabberd log files to diagnose the problem")
+           ejabberd:halt()
     end;
 start(_, _) ->
     {error, badarg}.
index cf3d099ccd1f2875d1212a9b98745a3b752b06c2..3f88df59aedbf4d7ac1acf204eb99a236ddb6811 100644 (file)
@@ -455,8 +455,7 @@ get_config_lines2(Fd, Data, CurrLine, [NextWanted | LNumbers], R) when is_list(D
 exit_or_halt(ExitText) ->
     case [Vsn || {ejabberd, _Desc, Vsn} <- application:which_applications()] of
        [] ->
-           timer:sleep(1000),
-           halt(string:substr(ExitText, 1, 199));
+           ejabberd:halt();
        [_] ->
            exit(ExitText)
     end.
index bf83fe13d13f8e4b441574cb6dd4a2e52b4a5e74..1ebaa17c314e2b56df30dde9881055ffcb1082cd 100644 (file)
@@ -152,7 +152,7 @@ sort_modules(Host, ModOpts) ->
                                           [Mod, DepMod]),
                                ?ERROR_MSG(ErrTxt, []),
                                digraph:del_vertex(G, Mod),
-                               maybe_halt_ejabberd(ErrTxt);
+                               maybe_halt_ejabberd();
                            false when Type == soft ->
                                ?WARNING_MSG("Module '~s' is recommended for "
                                             "module '~s' but is not found in "
@@ -240,11 +240,11 @@ start_module(Host, Module, Opts0, Order, NeedValidation) ->
                                               erlang:get_stacktrace()])
                        end,
                    ?CRITICAL_MSG(ErrorText, []),
-                   maybe_halt_ejabberd(ErrorText),
+                   maybe_halt_ejabberd(),
                    erlang:raise(Class, Reason, erlang:get_stacktrace())
            end;
-       {error, ErrorText} ->
-           maybe_halt_ejabberd(ErrorText)
+       {error, _ErrorText} ->
+           maybe_halt_ejabberd()
     end.
 
 -spec reload_modules(binary()) -> ok.
@@ -318,14 +318,13 @@ store_options(Host, Module, Opts, Order) ->
               #ejabberd_module{module_host = {Module, Host},
                                opts = Opts, order = Order}).
 
-maybe_halt_ejabberd(ErrorText) ->
+maybe_halt_ejabberd() ->
     case is_app_running(ejabberd) of
        false ->
            ?CRITICAL_MSG("ejabberd initialization was aborted "
                          "because a module start failed.",
                          []),
-           timer:sleep(3000),
-           erlang:halt(string:substr(lists:flatten(ErrorText), 1, 199));
+           ejabberd:halt();
        true ->
            ok
     end.
index 6b5900279488dfb3857e7cf94b984fbff54709eb..0728da7658120053d1725e8627fe9774b47c9e60 100644 (file)
@@ -529,5 +529,4 @@ report_and_stop(Tab, Err) ->
                  "Failed to convert '~s' table to binary: ~p",
                  [Tab, Err])),
     ?CRITICAL_MSG(ErrTxt, []),
-    timer:sleep(1000),
-    halt(string:substr(ErrTxt, 1, 199)).
+    ejabberd:halt().