You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2014/08/28 14:15:37 UTC

[06/37] couch-replicator commit: updated refs/heads/master to aafb5f9

Update to use new couch_event application


Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/commit/d6079a6f
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/tree/d6079a6f
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/diff/d6079a6f

Branch: refs/heads/master
Commit: d6079a6f2420cb8d704f10e0d2b3953453d1fc83
Parents: dd96e21
Author: Paul J. Davis <pa...@gmail.com>
Authored: Tue Apr 23 17:57:15 2013 -0500
Committer: Robert Newson <rn...@apache.org>
Committed: Tue Jul 29 13:44:46 2014 +0100

----------------------------------------------------------------------
 src/couch_replicator.app.src     |  3 +-
 src/couch_replicator_manager.erl | 67 +++++++++++++++++++++--------------
 src/couch_replicator_utils.erl   | 24 ++++++++-----
 3 files changed, 58 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/blob/d6079a6f/src/couch_replicator.app.src
----------------------------------------------------------------------
diff --git a/src/couch_replicator.app.src b/src/couch_replicator.app.src
index 740d007..06c6c68 100644
--- a/src/couch_replicator.app.src
+++ b/src/couch_replicator.app.src
@@ -37,7 +37,8 @@
         stdlib,
         couch_log,
         mem3,
-        couch
+        couch,
+        couch_event
     ]}
 ]}.
 

http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/blob/d6079a6f/src/couch_replicator_manager.erl
----------------------------------------------------------------------
diff --git a/src/couch_replicator_manager.erl b/src/couch_replicator_manager.erl
index 71e6be0..949622a 100644
--- a/src/couch_replicator_manager.erl
+++ b/src/couch_replicator_manager.erl
@@ -26,6 +26,8 @@
 % config_listener callback
 -export([handle_config_change/5]).
 
+-export([handle_db_event/3]).
+
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("mem3/include/mem3.hrl").
 -include("couch_replicator.hrl").
@@ -56,7 +58,7 @@
 ]).
 
 -record(state, {
-    db_notifier = nil,
+    event_listener = nil,
     scan_pid = nil,
     rep_start_pids = [],
     max_retries
@@ -134,7 +136,7 @@ init(_) ->
     ensure_rep_db_exists(LocalRepDb),
     Pid = changes_feed_loop(LocalRepDb, 0),
     {ok, #state{
-        db_notifier = db_update_notifier(),
+        event_listener = start_event_listener(),
         scan_pid = ScanPid,
         max_retries = retries_value(
             config:get("replicator", "max_replication_retry_count", "10")),
@@ -220,7 +222,7 @@ handle_info({'EXIT', From, Reason}, #state{scan_pid = From} = State) ->
     couch_log:error("Background scanner died. Reason: ~p", [Reason]),
     {stop, {scanner_died, Reason}, State};
 
-handle_info({'EXIT', From, Reason}, #state{db_notifier = From} = State) ->
+handle_info({'EXIT', From, Reason}, #state{event_listener = From} = State) ->
     couch_log:error("Database update notifier died. Reason: ~p", [Reason]),
     {stop, {db_update_notifier_died, Reason}, State};
 
@@ -252,7 +254,7 @@ terminate(_Reason, State) ->
     #state{
         scan_pid = ScanPid,
         rep_start_pids = StartPids,
-        db_notifier = DbNotifier
+        event_listener = Listener
     } = State,
     stop_all_replications(),
     lists:foreach(
@@ -264,7 +266,7 @@ terminate(_Reason, State) ->
     true = ets:delete(?REP_TO_STATE),
     true = ets:delete(?DOC_TO_REP),
     true = ets:delete(?DB_TO_SEQ),
-    couch_db_update_notifier:stop(DbNotifier).
+    couch_event:stop_listener(Listener).
 
 
 code_change(_OldVsn, State, _Extra) ->
@@ -309,28 +311,41 @@ has_valid_rep_id(<<?DESIGN_DOC_PREFIX, _Rest/binary>>) ->
 has_valid_rep_id(_Else) ->
     true.
 
-db_update_notifier() ->
-    Server = self(),
-    {ok, Notifier} = couch_db_update_notifier:start_link(fun
-        ({Event, DbName})
-                when Event == created; Event == updated; Event == deleted ->
-            IsRepDb = is_replicator_db(DbName),
-            case Event of
-                created when IsRepDb ->
-                    ensure_rep_ddoc_exists(DbName);
-                updated when IsRepDb ->
-                    Msg = {resume_scan, DbName},
-                    ok = gen_server:cast(Server, Msg);
-                deleted when IsRepDb ->
-                    clean_up_replications(DbName);
-                _ ->
-                    ok
-            end;
-        (_Event) ->
+
+start_event_listener() ->
+    {ok, Pid} = couch_event:link_listener(
+            ?MODULE, handle_db_event, self(), [all_dbs]
+        ),
+    Pid.
+
+
+handle_db_event(DbName, created, Server) ->
+    case is_replicator_db(DbName) of
+	true ->
+	    ensure_rep_ddoc_exists(DbName);
+	_ ->
+	    ok
+    end,
+    {ok, Server};
+handle_db_event(DbName, updated, Server) ->
+    case is_replicator_db(DbName) of
+        true ->
+	    Msg = {resume_scan, DbName},
+	    ok = gen_server:cast(Server, Msg);
+        _ ->
             ok
-        end
-    ),
-    Notifier.
+    end,
+    {ok, Server};
+handle_db_event(DbName, deleted, Server) ->
+    case is_replicator_db(DbName) of
+        true ->
+            clean_up_replications(DbName);
+        _ ->
+            ok
+    end,
+    {ok, Server};
+handle_db_event(_DbName, _Event, Server) ->
+    {ok, Server}.
 
 rescan(#state{scan_pid = nil} = State) ->
     true = ets:delete_all_objects(?DB_TO_SEQ),

http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/blob/d6079a6f/src/couch_replicator_utils.erl
----------------------------------------------------------------------
diff --git a/src/couch_replicator_utils.erl b/src/couch_replicator_utils.erl
index dff8e50..f489ff1 100644
--- a/src/couch_replicator_utils.erl
+++ b/src/couch_replicator_utils.erl
@@ -19,6 +19,8 @@
 -export([sum_stats/2, is_deleted/1]).
 -export([mp_parse_doc/2]).
 
+-export([handle_db_event/3]).
+
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("ibrowse/include/ibrowse.hrl").
 -include("couch_replicator_api_wrap.hrl").
@@ -370,21 +372,25 @@ close_db(_HttpDb) ->
 
 
 start_db_compaction_notifier(#db{name = DbName}, Server) ->
-    {ok, Notifier} = couch_db_update_notifier:start_link(
-        fun({compacted, DbName1}) when DbName1 =:= DbName ->
-                ok = gen_server:cast(Server, {db_compacted, DbName});
-            (_) ->
-                ok
-        end),
-    Notifier;
+    {ok, Pid} = couch_event:link_listener(
+            ?MODULE, handle_db_event, Server, [{dbname, DbName}]
+        ),
+    Pid;
 start_db_compaction_notifier(_, _) ->
     nil.
 
 
 stop_db_compaction_notifier(nil) ->
     ok;
-stop_db_compaction_notifier(Notifier) ->
-    couch_db_update_notifier:stop(Notifier).
+stop_db_compaction_notifier(Listener) ->
+    couch_event:stop_listener(Listener).
+
+
+handle_db_event(DbName, compacted, Server) ->
+    gen_server:cast(Server, {db_compacted, DbName}),
+    {ok, Server};
+handle_db_event(_DbName, _Event, Server) ->
+    {ok, Server}.
 
 
 sum_stats(#rep_stats{} = S1, #rep_stats{} = S2) ->