summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorILYA Khlopotov <iilyak@ca.ibm.com>2016-08-17 11:55:07 -0700
committerILYA Khlopotov <iilyak@apache.org>2019-02-15 13:12:31 +0000
commit62e8ba5fe3cc427b19ecc04508dd7dda3c85dbfd (patch)
treec945100f38fc3e6f9b706e3b195c7d900de79f89
parent79b5cd14bd1f2bf1d567867c8000b327310241ee (diff)
downloadcouchdb-62e8ba5fe3cc427b19ecc04508dd7dda3c85dbfd.tar.gz
Update handle_config_terminate API
COUCHDB-3102
-rw-r--r--src/custodian/src/custodian_server.erl27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/custodian/src/custodian_server.erl b/src/custodian/src/custodian_server.erl
index 41c8d80e0..6ab2f6a77 100644
--- a/src/custodian/src/custodian_server.erl
+++ b/src/custodian/src/custodian_server.erl
@@ -2,7 +2,7 @@
-module(custodian_server).
-behaviour(gen_server).
--vsn(2).
+-vsn(3).
-behaviour(config_listener).
% public api.
@@ -30,29 +30,30 @@
-define(VSN_0_2_7, 184129240591641721395874905059581858099).
+-define(RELISTEN_DELAY, 5000).
+
+
% public functions.
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
handle_config_change("couchdb", "maintenance_mode", _, _, S) ->
- ok = gen_server:cast(S, refresh),
+ ok = gen_server:cast(?MODULE, refresh),
{ok, S};
handle_config_change(_, _, _, _, S) ->
{ok, S}.
-handle_config_terminate(_, stop, _) -> ok;
-handle_config_terminate(Self, _, _) ->
- spawn(fun() ->
- timer:sleep(5000),
- config:listen_for_changes(?MODULE, Self)
- end).
+handle_config_terminate(_, stop, _) ->
+ ok;
+handle_config_terminate(_Server, _Reason, _State) ->
+ erlang:send_after(?RELISTEN_DELAY, whereis(?MODULE), restart_config_listener).
% gen_server functions.
init(_) ->
process_flag(trap_exit, true),
net_kernel:monitor_nodes(true),
- ok = config:listen_for_changes(?MODULE, self()),
+ ok = config:listen_for_changes(?MODULE, nil),
{ok, LisPid} = start_event_listener(),
{ok, start_shard_checker(#state{
event_listener=LisPid
@@ -87,7 +88,11 @@ handle_info({'EXIT', Pid, Reason}, #state{shard_checker=Pid}=State) ->
handle_info({'EXIT', Pid, Reason}, #state{event_listener=Pid}=State) ->
couch_log:notice("custodian update notifier died ~p", [Reason]),
{ok, Pid1} = start_event_listener(),
- {noreply, State#state{event_listener=Pid1}}.
+ {noreply, State#state{event_listener=Pid1}};
+
+handle_info(restart_config_listener, State) ->
+ ok = config:listen_for_changes(?MODULE, nil),
+ {noreply, State}.
terminate(_Reason, State) ->
couch_event:stop_listener(State#state.event_listener),
@@ -95,7 +100,7 @@ terminate(_Reason, State) ->
ok.
code_change(?VSN_0_2_7, State, _Extra) ->
- ok = config:listen_for_changes(?MODULE, self()),
+ ok = config:listen_for_changes(?MODULE, nil),
{ok, State};
code_change(_OldVsn, #state{}=State, _Extra) ->
{ok, State}.