Merge remote branch 'cloudant:3102-fix-config_subscription'

This closes #46

Signed-off-by: ILYA Khlopotov <iilyak@ca.ibm.com>
diff --git a/src/couch_replicator_manager.erl b/src/couch_replicator_manager.erl
index eed72b8..953b1bf 100644
--- a/src/couch_replicator_manager.erl
+++ b/src/couch_replicator_manager.erl
@@ -12,7 +12,7 @@
 
 -module(couch_replicator_manager).
 -behaviour(gen_server).
--vsn(2).
+-vsn(3).
 -behaviour(config_listener).
 
 % public API
@@ -55,6 +55,8 @@
 
 -define(replace(L, K, V), lists:keystore(K, 1, L, {K, V})).
 
+-define(RELISTEN_DELAY, 5000).
+
 -record(rep_state, {
     rep,
     starting,
@@ -143,17 +145,15 @@
 
 
 handle_config_change("replicator", "max_replication_retry_count", V, _, S) ->
-    ok = gen_server:cast(S, {set_max_retries, retries_value(V)}),
+    ok = gen_server:cast(?MODULE, {set_max_retries, retries_value(V)}),
     {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).
 
 init(_) ->
     process_flag(trap_exit, true),
@@ -163,7 +163,7 @@
     ?REP_TO_STATE = ets:new(?REP_TO_STATE, [named_table, set, public]),
     ?DB_TO_SEQ = ets:new(?DB_TO_SEQ, [named_table, set, public]),
     Server = self(),
-    ok = config:listen_for_changes(?MODULE, Server),
+    ok = config:listen_for_changes(?MODULE, nil),
     Epoch = make_ref(),
     ScanPid = spawn_link(fun() -> scan_all_dbs(Server) end),
     % Automatically start node local changes feed loop
@@ -330,6 +330,10 @@
 handle_info(shutdown, State) ->
     {stop, shutdown, State};
 
+handle_info(restart_config_listener, State) ->
+    ok = config:listen_for_changes(?MODULE, nil),
+    {noreply, State};
+
 handle_info(Msg, State) ->
     couch_log:error("Replication manager received unexpected message ~p", [Msg]),
     {stop, {unexpected_msg, Msg}, State}.