aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-29 10:46:20 +0300
committerEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-29 10:46:20 +0300
commit35576b460835a4c667a926ca86e58414fe3d8d12 (patch)
treea2c5f3ef196c2569227660779a901fcdee9fb18a /src
parentImprove ejabberd halting procedure (diff)
Improve hooks validator and fix bugs related to hooks registration
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_app.erl4
-rw-r--r--src/ejabberd_auth.erl4
-rw-r--r--src/ejabberd_listener.erl7
-rw-r--r--src/ejabberd_oauth.erl3
-rw-r--r--src/ejabberd_rdbms.erl8
-rw-r--r--src/ejabberd_redis_sup.erl8
-rw-r--r--src/ejabberd_router.erl2
-rw-r--r--src/ejabberd_sup.erl8
-rw-r--r--src/gen_mod.erl16
-rw-r--r--src/mod_delegation.erl11
-rw-r--r--src/mod_privilege.erl11
-rw-r--r--src/mod_push_keepalive.erl2
12 files changed, 64 insertions, 20 deletions
diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl
index 5448a99c2..eb8bca231 100644
--- a/src/ejabberd_app.erl
+++ b/src/ejabberd_app.erl
@@ -97,11 +97,11 @@ start_included_apps() ->
%% before shutting down the processes of the application.
prep_stop(State) ->
ejabberd_hooks:run(ejabberd_stopping, []),
- ejabberd_listener:stop_listeners(),
+ ejabberd_listener:stop(),
ejabberd_sm:stop(),
ejabberd_service:stop(),
ejabberd_s2s:stop(),
- gen_mod:stop_modules(),
+ gen_mod:stop(),
State.
%% All the processes were killed when this function is called
diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl
index 415e42e82..2f4983500 100644
--- a/src/ejabberd_auth.erl
+++ b/src/ejabberd_auth.erl
@@ -155,8 +155,8 @@ handle_info(Info, State) ->
{noreply, State}.
terminate(_Reason, State) ->
- ejabberd_hooks:delete(host_up, ?MODULE, start, 30),
- ejabberd_hooks:delete(host_down, ?MODULE, stop, 80),
+ ejabberd_hooks:delete(host_up, ?MODULE, host_up, 30),
+ ejabberd_hooks:delete(host_down, ?MODULE, host_down, 80),
ejabberd_hooks:delete(config_reloaded, ?MODULE, config_reloaded, 40),
lists:foreach(
fun({Host, Modules}) ->
diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl
index f648b3eb3..6393ed4f4 100644
--- a/src/ejabberd_listener.erl
+++ b/src/ejabberd_listener.erl
@@ -28,7 +28,7 @@
-author('alexey@process-one.net').
-author('ekhramtsov@process-one.net').
--export([start_link/0, init/1, start/3, init/3,
+-export([start_link/0, init/1, stop/0, start/3, init/3,
start_listeners/0, start_listener/3, stop_listeners/0,
add_listener/3, delete_listener/2,
config_reloaded/0]).
@@ -71,6 +71,11 @@ init(_) ->
Listeners = ejabberd_option:listen(),
{ok, {{one_for_one, 10, 1}, listeners_childspec(Listeners)}}.
+stop() ->
+ ejabberd_hooks:delete(config_reloaded, ?MODULE, config_reloaded, 50),
+ stop_listeners(),
+ ejabberd_sup:stop_child(?MODULE).
+
-spec listeners_childspec([listener()]) -> [supervisor:child_spec()].
listeners_childspec(Listeners) ->
lists:map(
diff --git a/src/ejabberd_oauth.erl b/src/ejabberd_oauth.erl
index 28f9b0de0..31826fa53 100644
--- a/src/ejabberd_oauth.erl
+++ b/src/ejabberd_oauth.erl
@@ -174,7 +174,8 @@ handle_info(Info, State) ->
?WARNING_MSG("Unexpected info: ~p", [Info]),
{noreply, State}.
-terminate(_Reason, _State) -> ok.
+terminate(_Reason, _State) ->
+ ejabberd_hooks:delete(config_reloaded, ?MODULE, config_reloaded, 50).
code_change(_OldVsn, State, _Extra) -> {ok, State}.
diff --git a/src/ejabberd_rdbms.erl b/src/ejabberd_rdbms.erl
index 3acb044f0..b3cbe6ec1 100644
--- a/src/ejabberd_rdbms.erl
+++ b/src/ejabberd_rdbms.erl
@@ -29,7 +29,7 @@
-author('alexey@process-one.net').
--export([start_link/0, init/1,
+-export([start_link/0, init/1, stop/0,
config_reloaded/0, start_host/1, stop_host/1]).
-include("logger.hrl").
@@ -46,6 +46,12 @@ init([]) ->
ejabberd_hooks:add(config_reloaded, ?MODULE, config_reloaded, 20),
{ok, {{one_for_one, 10, 1}, get_specs()}}.
+stop() ->
+ ejabberd_hooks:delete(host_up, ?MODULE, start_host, 20),
+ ejabberd_hooks:delete(host_down, ?MODULE, stop_host, 90),
+ ejabberd_hooks:delete(config_reloaded, ?MODULE, config_reloaded, 20),
+ ejabberd_sup:stop_child(?MODULE).
+
-spec get_specs() -> [supervisor:child_spec()].
get_specs() ->
lists:flatmap(
diff --git a/src/ejabberd_redis_sup.erl b/src/ejabberd_redis_sup.erl
index 3b5d4b7af..35ccd7772 100644
--- a/src/ejabberd_redis_sup.erl
+++ b/src/ejabberd_redis_sup.erl
@@ -25,7 +25,7 @@
-behaviour(supervisor).
%% API
--export([start/0, start_link/0]).
+-export([start/0, stop/0, start_link/0]).
-export([get_pool_size/0, config_reloaded/0]).
%% Supervisor callbacks
@@ -52,6 +52,12 @@ start() ->
end
end.
+stop() ->
+ ejabberd_hooks:delete(config_reloaded, ?MODULE, config_reloaded, 20),
+ _ = supervisor:terminate_child(ejabberd_db_sup, ?MODULE),
+ _ = supervisor:delete_child(ejabberd_db_sup, ?MODULE),
+ ok.
+
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl
index a8a471258..fef88d468 100644
--- a/src/ejabberd_router.erl
+++ b/src/ejabberd_router.erl
@@ -371,7 +371,7 @@ handle_info(Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
- ejabberd_hooks:add(config_reloaded, ?MODULE, config_reloaded, 50).
+ ejabberd_hooks:delete(config_reloaded, ?MODULE, config_reloaded, 50).
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
diff --git a/src/ejabberd_sup.erl b/src/ejabberd_sup.erl
index 6eaa5aad8..cb8c3fa86 100644
--- a/src/ejabberd_sup.erl
+++ b/src/ejabberd_sup.erl
@@ -28,7 +28,7 @@
-behaviour(supervisor).
--export([start_link/0, init/1]).
+-export([start_link/0, init/1, stop_child/1]).
-define(SHUTDOWN_TIMEOUT, timer:minutes(1)).
@@ -67,6 +67,12 @@ init([]) ->
worker(ejabberd_auth),
worker(ejabberd_oauth)]}}.
+-spec stop_child(atom()) -> ok.
+stop_child(Name) ->
+ _ = supervisor:terminate_child(?MODULE, Name),
+ _ = supervisor:delete_child(?MODULE, Name),
+ ok.
+
%%%===================================================================
%%% Internal functions
%%%===================================================================
diff --git a/src/gen_mod.erl b/src/gen_mod.erl
index 2401a512a..4306ab78e 100644
--- a/src/gen_mod.erl
+++ b/src/gen_mod.erl
@@ -27,7 +27,7 @@
-author('alexey@process-one.net').
-export([init/1, start_link/0, start_child/3, start_child/4,
- stop_child/1, stop_child/2, config_reloaded/0]).
+ stop_child/1, stop_child/2, stop/0, config_reloaded/0]).
-export([start_module/2, stop_module/2, stop_module_keep_config/2,
get_opt/2, set_opt/3, get_opt_hosts/1, is_equal_opt/3,
get_module_opt/3, get_module_opts/2, get_module_opt_hosts/2,
@@ -89,6 +89,14 @@ init([]) ->
{read_concurrency, true}]),
{ok, {{one_for_one, 10, 1}, []}}.
+-spec stop() -> ok.
+stop() ->
+ ejabberd_hooks:delete(config_reloaded, ?MODULE, config_reloaded, 50),
+ ejabberd_hooks:delete(host_up, ?MODULE, start_modules, 40),
+ ejabberd_hooks:delete(host_down, ?MODULE, stop_modules, 70),
+ stop_modules(),
+ ejabberd_sup:stop_child(ejabberd_gen_mod_sup).
+
-spec start_child(module(), binary(), opts()) -> {ok, pid()} | {error, any()}.
start_child(Mod, Host, Opts) ->
start_child(Mod, Host, Opts, get_module_proc(Host, Mod)).
@@ -255,9 +263,9 @@ is_app_running(AppName) ->
-spec stop_modules() -> ok.
stop_modules() ->
lists:foreach(
- fun(Host) ->
- stop_modules(Host)
- end, ejabberd_option:hosts()).
+ fun(Host) ->
+ stop_modules(Host)
+ end, ejabberd_option:hosts()).
-spec stop_modules(binary()) -> ok.
stop_modules(Host) ->
diff --git a/src/mod_delegation.erl b/src/mod_delegation.erl
index 8dbc903ee..681f7c123 100644
--- a/src/mod_delegation.erl
+++ b/src/mod_delegation.erl
@@ -213,9 +213,16 @@ handle_info(Info, State) ->
{noreply, State}.
terminate(_Reason, State) ->
- %% Note: we don't remove component_* hooks because they are global
- %% and might be registered within a module on another virtual host
ServerHost = State#state.server_host,
+ case gen_mod:is_loaded_elsewhere(ServerHost, ?MODULE) of
+ false ->
+ ejabberd_hooks:delete(component_connected, ?MODULE,
+ component_connected, 50),
+ ejabberd_hooks:delete(component_disconnected, ?MODULE,
+ component_disconnected, 50);
+ true ->
+ ok
+ end,
ejabberd_hooks:delete(disco_local_features, ServerHost, ?MODULE,
disco_local_features, 50),
ejabberd_hooks:delete(disco_sm_features, ServerHost, ?MODULE,
diff --git a/src/mod_privilege.erl b/src/mod_privilege.erl
index b6e56ead4..9ca78f67f 100644
--- a/src/mod_privilege.erl
+++ b/src/mod_privilege.erl
@@ -269,9 +269,16 @@ handle_info(Info, State) ->
{noreply, State}.
terminate(_Reason, State) ->
- %% Note: we don't remove component_* hooks because they are global
- %% and might be registered within a module on another virtual host
Host = State#state.server_host,
+ case gen_mod:is_loaded_elsewhere(Host, ?MODULE) of
+ false ->
+ ejabberd_hooks:delete(component_connected, ?MODULE,
+ component_connected, 50),
+ ejabberd_hooks:delete(component_disconnected, ?MODULE,
+ component_disconnected, 50);
+ true ->
+ ok
+ end,
ejabberd_hooks:delete(local_send_to_resource_hook, Host, ?MODULE,
process_message, 50),
ejabberd_hooks:delete(roster_remote_access, Host, ?MODULE,
diff --git a/src/mod_push_keepalive.erl b/src/mod_push_keepalive.erl
index 0af5e0ed2..3f55eaa92 100644
--- a/src/mod_push_keepalive.erl
+++ b/src/mod_push_keepalive.erl
@@ -110,8 +110,6 @@ register_hooks(Host) ->
-spec unregister_hooks(binary()) -> ok.
unregister_hooks(Host) ->
- ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE,
- disco_sm_features, 50),
ejabberd_hooks:delete(c2s_session_pending, Host, ?MODULE,
c2s_session_pending, 50),
ejabberd_hooks:delete(c2s_session_resumed, Host, ?MODULE,