You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2017/03/10 16:18:45 UTC

[1/2] couch-replicator commit: updated refs/heads/master to d00b981

Repository: couchdb-couch-replicator
Updated Branches:
  refs/heads/master 46aa27fa6 -> d00b98144


Revert "Don't scan empty replicator databases"

This reverts commit 46aa27fa674a4c1e590aeecd76123e4f91d78fd5.


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/f63efa78
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/tree/f63efa78
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/diff/f63efa78

Branch: refs/heads/master
Commit: f63efa786fec5cc40e6c6193470399da99385abf
Parents: 46aa27f
Author: Nick Vatamaniuc <va...@apache.org>
Authored: Fri Mar 10 01:13:28 2017 -0500
Committer: Nick Vatamaniuc <va...@apache.org>
Committed: Fri Mar 10 01:13:28 2017 -0500

----------------------------------------------------------------------
 src/couch_replicator_manager.erl | 46 +++--------------------------------
 1 file changed, 3 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/blob/f63efa78/src/couch_replicator_manager.erl
----------------------------------------------------------------------
diff --git a/src/couch_replicator_manager.erl b/src/couch_replicator_manager.erl
index 9f17087..2bcad69 100644
--- a/src/couch_replicator_manager.erl
+++ b/src/couch_replicator_manager.erl
@@ -266,17 +266,9 @@ handle_cast({resume_scan, DbName}, State) ->
             end,
             true = ets:insert(?DB_TO_SEQ, {DbName, Since, false}),
             ensure_rep_ddoc_exists(DbName),
-            case has_replication_docs(DbName) of
-                false ->
-                    %% the database is empty save for the rep_ddoc,
-                    %% don't bother scanning it.
-                    couch_log:debug("ignoring empty ~s", [DbName]),
-                    Pids;
-                true ->
-                    Pid = start_changes_reader(DbName, Since, State#state.epoch),
-                    couch_log:debug("Scanning ~s from update_seq ~p", [DbName, Since]),
-                    [{DbName, Pid} | Pids]
-            end
+            Pid = start_changes_reader(DbName, Since, State#state.epoch),
+            couch_log:debug("Scanning ~s from update_seq ~p", [DbName, Since]),
+            [{DbName, Pid} | Pids]
     end,
     {noreply, State#state{rep_start_pids = NewPids}};
 
@@ -1013,38 +1005,6 @@ get_json_value(Key, Props, Default) when is_binary(Key) ->
     end.
 
 
-has_replication_docs(DbName) ->
-    {ok, Db} = couch_db:open(DbName, []),
-    try
-        case couch_db:get_doc_count(Db) of
-            {ok, 0} ->
-                false;
-            {ok, 1} ->
-                case first_doc_id(Db) of
-                    <<"_design/_replicator">> ->
-                        false;
-                    _Else ->
-                        true
-                end;
-            _Else ->
-                true
-        end
-    after
-        couch_db:close(Db)
-    end.
-
-
-first_doc_id(#db{} = Db) ->
-    Fun = fun
-        (#full_doc_info{deleted = true}, _Reds, Acc) ->
-            {ok, Acc};
-        (FDI, _Reds, _Acc) ->
-            {stop, FDI#full_doc_info.id}
-    end,
-    {ok, _, Id} = couch_btree:fold(Db#db.id_tree, Fun, nil, []),
-    Id.
-
-
 -ifdef(TEST).
 
 -include_lib("couch/include/couch_eunit.hrl").


[2/2] couch-replicator commit: updated refs/heads/master to d00b981

Posted by va...@apache.org.
Prevent replicator manager change feeds from getting stuck

Switch them them from `longpoll` to `normal`

This would prevent them being stuck. That could happen if more than one
`resume_scan` message arrives for the same shard. The first time a longpoll
changef feed would finish and end sequence is checkpointed. But if another
resume_scan arrives and database hasn't changed then the longpoll change
feed would hang until db is updated.

The reason there would be multiple `resume_scan` messages is because there
is a race condition between db update handler and scanner component. They are
both started asynchronously roughly at the same. Scanner finds new shard while
db handler notices changes for those shards. If shards are modified quickly
after they are discovered by the scanner both of those components would issue
a resume_scan.

The effect of this would be more pronounced if there are a large number of
_replicator shards and constant db creation/deletion/updates.

COUCHDB-2964


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/d00b9814
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/tree/d00b9814
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/diff/d00b9814

Branch: refs/heads/master
Commit: d00b981445c03622497088eb872059ab4f48b298
Parents: f63efa7
Author: Nick Vatamaniuc <va...@apache.org>
Authored: Fri Mar 10 01:15:47 2017 -0500
Committer: Nick Vatamaniuc <va...@apache.org>
Committed: Fri Mar 10 01:15:47 2017 -0500

----------------------------------------------------------------------
 src/couch_replicator_manager.erl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-couch-replicator/blob/d00b9814/src/couch_replicator_manager.erl
----------------------------------------------------------------------
diff --git a/src/couch_replicator_manager.erl b/src/couch_replicator_manager.erl
index 2bcad69..85dd428 100644
--- a/src/couch_replicator_manager.erl
+++ b/src/couch_replicator_manager.erl
@@ -375,7 +375,7 @@ changes_reader({Server, Epoch}, DbName, Since) ->
         #changes_args{
             include_docs = true,
             since = Since,
-            feed = "longpoll",
+            feed = "normal",
             timeout = infinity
         },
         {json_req, null},