diff options
author | Evgeny Khramtsov <ekhramtsov@process-one.net> | 2019-07-29 10:46:20 +0300 |
---|---|---|
committer | Evgeny Khramtsov <ekhramtsov@process-one.net> | 2019-07-29 10:46:20 +0300 |
commit | 35576b460835a4c667a926ca86e58414fe3d8d12 (patch) | |
tree | a2c5f3ef196c2569227660779a901fcdee9fb18a /src | |
parent | Improve ejabberd halting procedure (diff) |
Improve hooks validator and fix bugs related to hooks registration
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_app.erl | 4 | ||||
-rw-r--r-- | src/ejabberd_auth.erl | 4 | ||||
-rw-r--r-- | src/ejabberd_listener.erl | 7 | ||||
-rw-r--r-- | src/ejabberd_oauth.erl | 3 | ||||
-rw-r--r-- | src/ejabberd_rdbms.erl | 8 | ||||
-rw-r--r-- | src/ejabberd_redis_sup.erl | 8 | ||||
-rw-r--r-- | src/ejabberd_router.erl | 2 | ||||
-rw-r--r-- | src/ejabberd_sup.erl | 8 | ||||
-rw-r--r-- | src/gen_mod.erl | 16 | ||||
-rw-r--r-- | src/mod_delegation.erl | 11 | ||||
-rw-r--r-- | src/mod_privilege.erl | 11 | ||||
-rw-r--r-- | src/mod_push_keepalive.erl | 2 |
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, |