aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_redis.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_redis.erl')
-rw-r--r--src/ejabberd_redis.erl25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/ejabberd_redis.erl b/src/ejabberd_redis.erl
index 9d4264df3..6a853737d 100644
--- a/src/ejabberd_redis.erl
+++ b/src/ejabberd_redis.erl
@@ -28,7 +28,7 @@
-behaviour(ejabberd_config).
%% API
--export([start/0, start_link/0, q/1, qp/1, opt_type/1]).
+-export([start/0, stop/0, start_link/0, q/1, qp/1, host_up/1, opt_type/1]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
@@ -49,16 +49,16 @@ start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
start() ->
+ ejabberd_hooks:add(config_reloaded, ?MODULE, start, 20),
+ ejabberd_hooks:add(host_up, ?MODULE, host_up, 20),
case lists:any(
fun(Host) ->
is_redis_configured(Host)
end, ?MYHOSTS) of
true ->
- Spec = {?MODULE, {?MODULE, start_link, []},
- permanent, 2000, worker, [?MODULE]},
- supervisor:start_child(ejabberd_sup, Spec);
+ do_start();
false ->
- ok
+ stop()
end.
q(Command) ->
@@ -71,6 +71,16 @@ qp(Pipeline) ->
catch _:Reason -> {error, Reason}
end.
+stop() ->
+ supervisor:terminate_child(ejabberd_sup, ?MODULE),
+ supervisor:delete_child(ejabberd_sup, ?MODULE).
+
+host_up(Host) ->
+ case is_redis_configured(Host) of
+ true -> do_start();
+ false -> ok
+ end.
+
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
@@ -108,6 +118,11 @@ code_change(_OldVsn, State, _Extra) ->
%%%===================================================================
%%% Internal functions
%%%===================================================================
+do_start() ->
+ Spec = {?MODULE, {?MODULE, start_link, []},
+ permanent, 5000, worker, [?MODULE]},
+ supervisor:start_child(ejabberd_sup, Spec).
+
is_redis_configured(Host) ->
ServerConfigured = ejabberd_config:has_option({redis_server, Host}),
PortConfigured = ejabberd_config:has_option({redis_port, Host}),