summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <robert.newson@cloudant.com>2013-11-11 18:03:24 +0000
committerRobert Newson <robert.newson@cloudant.com>2013-11-20 12:51:52 +0000
commit924f26d661481f20b238be2ae2a00c47e79f7252 (patch)
tree9eea116b7d273d6fd62b1e800898e9ef4a9249d2
parent1c1b48e19d0eb36691d98f2194c19fe898cb55db (diff)
downloadcouchdb-924f26d661481f20b238be2ae2a00c47e79f7252.tar.gz
Listen for config changes to maintenance_mode
-rw-r--r--src/custodian/src/custodian_server.erl19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/custodian/src/custodian_server.erl b/src/custodian/src/custodian_server.erl
index 188d3713f..be69718a3 100644
--- a/src/custodian/src/custodian_server.erl
+++ b/src/custodian/src/custodian_server.erl
@@ -2,6 +2,7 @@
-module(custodian_server).
-behaviour(gen_server).
+-behaviour(config_listener).
% public api.
-export([start_link/0]).
@@ -16,6 +17,9 @@
handle_db_event/3
]).
+% config_listener callback
+-export([handle_config_change/5]).
+
% private records.
-record(state, {
event_listener,
@@ -28,10 +32,17 @@
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+handle_config_change("cloudant", "maintenance_mode", _, _, S) ->
+ ok = gen_server:cast(S, refresh),
+ {ok, S};
+handle_config_change(_, _, _, _, S) ->
+ {ok, S}.
+
% gen_server functions.
init(_) ->
process_flag(trap_exit, true),
net_kernel:monitor_nodes(true),
+ ok = config:listen_for_changes(?MODULE, self()),
{ok, LisPid} = start_event_listener(),
{ok, start_shard_checker(#state{
event_listener=LisPid
@@ -43,6 +54,14 @@ handle_call(_Msg, _From, State) ->
handle_cast(refresh, State) ->
{noreply, start_shard_checker(State)}.
+handle_info({gen_event_EXIT, {config_listener, ?MODULE}, _Reason}, State) ->
+ erlang:send_after(5000, self(), restart_config_listener),
+ {noreply, State};
+
+handle_info(restart_config_listener, State) ->
+ ok = config:listen_for_changes(?MODULE, self()),
+ {noreply, State};
+
handle_info({nodeup, _}, State) ->
{noreply, start_shard_checker(State)};