Merge remote branch 'cloudant:3102-fix-config_subscription'
This closes #18
Signed-off-by: ILYA Khlopotov <iilyak@ca.ibm.com>
diff --git a/src/couch_index.erl b/src/couch_index.erl
index b6a6c99..a5958b9 100644
--- a/src/couch_index.erl
+++ b/src/couch_index.erl
@@ -12,9 +12,8 @@
-module(couch_index).
-behaviour(gen_server).
--behaviour(config_listener).
--vsn(1).
+-vsn(2).
%% API
-export([start_link/1, stop/1, get_state/2, get_info/1]).
@@ -26,15 +25,13 @@
-export([init/1, terminate/2, code_change/3]).
-export([handle_call/3, handle_cast/2, handle_info/2]).
-% config_listener api
--export([handle_config_change/5, handle_config_terminate/3]).
-
-include_lib("couch/include/couch_db.hrl").
-define(CHECK_INTERVAL, 600000). % 10 minutes
-
+-define(RELISTEN_DELAY, 5000).
+-define(CONFIG_SUBSCRIPTION, [{"query_server_config", "commit_freq"}]).
-record(st, {
mod,
@@ -89,7 +86,7 @@
init({Mod, IdxState}) ->
- ok = config:listen_for_changes(?MODULE, nil),
+ ok = config:subscribe_for_changes(?CONFIG_SUBSCRIPTION),
DbName = Mod:get(db_name, IdxState),
erlang:send_after(?CHECK_INTERVAL, self(), maybe_close),
Resp = couch_util:with_db(DbName, fun(Db) ->
@@ -344,25 +341,19 @@
Args = [Mod:get(db_name, IdxState), Mod:get(idx_name, IdxState)],
couch_log:info("Index shutdown by monitor notice for db: ~s idx: ~s", Args),
catch send_all(State#st.waiters, shutdown),
- {stop, normal, State#st{waiters=[]}}.
-
+ {stop, normal, State#st{waiters=[]}};
+handle_info({config_change, "query_server_config", "commit_freq", NewDelay, _}, State) ->
+ handle_cast({config_change, NewDelay}, State);
+handle_info({gen_event_EXIT, _Handler, _Reason}, State) ->
+ erlang:send_after(?RELISTEN_DELAY, self(), restart_config_listener),
+ {noreply, State};
+handle_info(restart_config_listener, State) ->
+ ok = config:subscribe_for_changes(?CONFIG_SUBSCRIPTION),
+ {noreply, State}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
-
-handle_config_change("query_server_config", "commit_freq", Val, _, _) ->
- {ok, gen_server:cast(?MODULE, {config_update, Val})};
-handle_config_change(_, _, _, _, _) ->
- {ok, nil}.
-
-handle_config_terminate(_Server, stop, _State) -> ok;
-handle_config_terminate(_Server, _Reason, _State) ->
- spawn(fun() ->
- timer:sleep(5000),
- config:listen_for_changes(?MODULE, nil)
- end).
-
maybe_restart_updater(#st{waiters=[]}) ->
ok;
maybe_restart_updater(#st{mod=Mod, idx_state=IdxState}=State) ->
diff --git a/src/couch_index_server.erl b/src/couch_index_server.erl
index ac2c609..4e86f5e 100644
--- a/src/couch_index_server.erl
+++ b/src/couch_index_server.erl
@@ -14,7 +14,7 @@
-behaviour(gen_server).
-behaviour(config_listener).
--vsn(1).
+-vsn(2).
-export([start_link/0, validate/2, get_index/4, get_index/3, get_index/2]).
@@ -33,7 +33,7 @@
-define(BY_SIG, couchdb_indexes_by_sig).
-define(BY_PID, couchdb_indexes_by_pid).
-define(BY_DB, couchdb_indexes_by_db).
-
+-define(RELISTEN_DELAY, 5000).
-record(st, {root_dir}).
@@ -115,7 +115,7 @@
init([]) ->
process_flag(trap_exit, true),
- ok = config:listen_for_changes(?MODULE, nil),
+ ok = config:listen_for_changes(?MODULE, couch_index_util:root_dir()),
ets:new(?BY_SIG, [protected, set, named_table]),
ets:new(?BY_PID, [private, set, named_table]),
ets:new(?BY_DB, [protected, bag, named_table]),
@@ -175,6 +175,9 @@
ok
end,
{noreply, Server};
+handle_info(restart_config_listener, State) ->
+ ok = config:listen_for_changes(?MODULE, couch_index_util:root_dir()),
+ {noreply, State};
handle_info(Msg, State) ->
couch_log:warning("~p did not expect ~p", [?MODULE, Msg]),
{noreply, State}.
@@ -197,13 +200,11 @@
handle_config_change(_, _, _, _, RootDir) ->
{ok, RootDir}.
-handle_config_terminate(_Server, stop, _State) -> ok;
+handle_config_terminate(_, stop, _) ->
+ ok;
handle_config_terminate(_Server, _Reason, _State) ->
- State = couch_index_util:root_dir(),
- spawn(fun() ->
- timer:sleep(5000),
- config:listen_for_changes(?MODULE, State)
- end).
+ erlang:send_after(?RELISTEN_DELAY, whereis(?MODULE), restart_config_listener),
+ {ok, couch_index_util:root_dir()}.
new_index({Mod, IdxState, DbName, Sig}) ->
DDocId = Mod:get(idx_name, IdxState),