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:23:00 UTC

[40/50] mem3 commit: updated refs/heads/master to 64c0c74

Allow target_uuid prefixes in find_source_seq

Since sequence values only contain UUID prefixes so we need to account
for that when locating the replication checkpoints.

BugId: 21973


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

Branch: refs/heads/master
Commit: c63fc057078544290825172790b3c5c871f75037
Parents: bf07a7c
Author: Paul J. Davis <pa...@gmail.com>
Authored: Fri Dec 6 13:52:28 2013 -0600
Committer: Robert Newson <rn...@apache.org>
Committed: Wed Jul 23 18:50:53 2014 +0100

----------------------------------------------------------------------
 src/mem3_rep.erl | 46 ++++++++++++++++++++++++++++++++++++++++------
 src/mem3_rpc.erl |  1 +
 2 files changed, 41 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-mem3/blob/c63fc057/src/mem3_rep.erl
----------------------------------------------------------------------
diff --git a/src/mem3_rep.erl b/src/mem3_rep.erl
index bdc6fa4..2186fa3 100644
--- a/src/mem3_rep.erl
+++ b/src/mem3_rep.erl
@@ -135,12 +135,10 @@ make_local_id(SourceThing, TargetThing, Filter) ->
 %% as they've seen updates on this node. We can detect that by
 %% looking for our push replication history and choosing the
 %% largest source_seq that has a target_seq =< TgtSeq.
-find_source_seq(SrcDb, TgtNode, TgtUUID, TgtSeq) ->
-    SrcNode = atom_to_binary(node(), utf8),
-    SrcUUID = couch_db:get_uuid(SrcDb),
-    DocId = make_local_id(SrcUUID, TgtUUID),
-    case couch_db:open_doc(SrcDb, DocId, []) of
-    {ok, Doc} ->
+find_source_seq(SrcDb, TgtNode, TgtUUIDPrefix, TgtSeq) ->
+    case find_repl_doc(SrcDb, TgtUUIDPrefix) of
+    {ok, TgtUUID, Doc} ->
+        SrcNode = atom_to_binary(node(), utf8),
         find_source_seq_int(Doc, SrcNode, TgtNode, TgtUUID, TgtSeq);
     {not_found, _} ->
         0
@@ -302,6 +300,42 @@ update_locals(Acc) ->
     {ok, _} = couch_db:update_doc(Db, #doc{id = Id, body = NewBody}, []).
 
 
+find_repl_doc(SrcDb, TgtUUIDPrefix) ->
+    SrcUUID = couch_db:get_uuid(SrcDb),
+    S = couch_util:encodeBase64Url(couch_util:md5(term_to_binary(SrcUUID))),
+    DocIdPrefix = <<"_local/shard-sync-", S/binary, "-">>,
+    FoldFun = fun({DocId, {Rev0, {BodyProps}}}, _, _) ->
+        TgtUUID = couch_util:get_value(<<"target_uuid">>, BodyProps, <<>>),
+        case is_prefix(DocIdPrefix, DocId) of
+            true ->
+                case is_prefix(TgtUUIDPrefix, TgtUUID) of
+                    true ->
+                        Rev = list_to_binary(integer_to_list(Rev0)),
+                        Doc = #doc{id=DocId, revs={0, [Rev]}, body={BodyProps}},
+                        {stop, {TgtUUID, Doc}};
+                    false ->
+                        {ok, not_found}
+                end;
+            _ ->
+                {stop, not_found}
+        end
+    end,
+    Options = [{start_key, DocIdPrefix}],
+    case couch_btree:fold(SrcDb#db.local_tree, FoldFun, not_found, Options) of
+        {ok, _, {TgtUUID, Doc}} ->
+            {ok, TgtUUID, Doc};
+        {ok, _, not_found} ->
+            {not_found, missing};
+        Else ->
+            twig:log(err, "Error finding replication doc: ~w", [Else]),
+            {not_found, missing}
+    end.
+
+
+is_prefix(Prefix, Subject) ->
+    binary:longest_common_prefix([Prefix, Subject]) == size(Prefix).
+
+
 filter_doc(Filter, FullDocInfo) when is_function(Filter) ->
     try Filter(FullDocInfo) of
         discard -> discard;

http://git-wip-us.apache.org/repos/asf/couchdb-mem3/blob/c63fc057/src/mem3_rpc.erl
----------------------------------------------------------------------
diff --git a/src/mem3_rpc.erl b/src/mem3_rpc.erl
index 1e77b57..8d8c832 100644
--- a/src/mem3_rpc.erl
+++ b/src/mem3_rpc.erl
@@ -88,6 +88,7 @@ save_checkpoint_rpc(DbName, Id, SourceSeq, NewEntry0, History0) ->
             ] ++ NewEntry0},
             Body = {[
                 {<<"seq">>, SourceSeq},
+                {<<"target_uuid">>, couch_db:get_uuid(Db)},
                 {<<"history">>, add_checkpoint(NewEntry, History0)}
             ]},
             Doc = #doc{id = Id, body = Body},