You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ch...@apache.org on 2014/08/29 22:33:42 UTC

[03/30] couchdb commit: updated refs/heads/1963-eunit-bigcouch to d1a82df

Be more specific on the merge result

We have three results that can happen when merging a path into a
revision tree:

 * We can extend a branch which replaces a leaf
 * We can create a new branch which results in a new leaf
 * We can land on an existing internal node

The first result (new_leaf) means that there is no conflict in the
update operation. The second (new_branch) means we branched a revision
path which means the operation introduces a conflict. The third
(internal_node) means that the merge was the result of an edit that
has already been applied to this document.

For the third case we have a subtle special case in that if we have
deleted the document and want to recreate it into the same initial
state we need to give the new state a different revision. The current
code follows the edit path and extends the first deleted leaf it
finds.

BugzID: 25150

Conflicts:
	apps/couch/src/couch_key_tree.erl


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

Branch: refs/heads/1963-eunit-bigcouch
Commit: 5b1f7cea04b08fea12364acae72a9898d45212d6
Parents: 699ad9c
Author: Paul J. Davis <pa...@gmail.com>
Authored: Fri Nov 15 12:13:17 2013 -0600
Committer: Robert Newson <rn...@apache.org>
Committed: Wed Aug 6 19:29:59 2014 +0100

----------------------------------------------------------------------
 test/etap/060-kt-merging.t | 53 ++++++++++++++++++++---------------------
 1 file changed, 26 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/5b1f7cea/test/etap/060-kt-merging.t
----------------------------------------------------------------------
diff --git a/test/etap/060-kt-merging.t b/test/etap/060-kt-merging.t
index efbdbf6..e0b1a9c 100755
--- a/test/etap/060-kt-merging.t
+++ b/test/etap/060-kt-merging.t
@@ -29,12 +29,12 @@ test() ->
     One = {1, {"1","foo",[]}},
 
     etap:is(
-        {[One], no_conflicts},
+        {[One], new_leaf},
         couch_key_tree:merge([], One, 10),
         "The empty tree is the identity for merge."
     ),
     etap:is(
-        {[One], no_conflicts},
+        {[One], internal_node},
         couch_key_tree:merge([One], One, 10),
         "Merging is reflexive."
     ),
@@ -43,7 +43,7 @@ test() ->
                {1, {"2","foo",[]}}],
 
     etap:is(
-        {TwoSibs, no_conflicts},
+        {TwoSibs, internal_node},
         couch_key_tree:merge(TwoSibs, One, 10),
         "Merging a prefix of a tree with the tree yields the tree."
     ),
@@ -54,7 +54,7 @@ test() ->
                  {1, {"3","foo",[]}}],
 
     etap:is(
-        {ThreeSibs, conflicts},
+        {ThreeSibs, new_branch},
         couch_key_tree:merge(TwoSibs, Three, 10),
         "Merging a third unrelated branch leads to a conflict."
     ),
@@ -63,30 +63,17 @@ test() ->
     TwoChild = {1, {"1","foo", [{"1a", "bar", [{"1aa", "bar", []}]}]}},
 
     etap:is(
-        {[TwoChild], no_conflicts},
+        {[TwoChild], internal_node},
         couch_key_tree:merge([TwoChild], TwoChild, 10),
         "Merging two children is still reflexive."
     ),
 
     TwoChildSibs = {1, {"1","foo", [{"1a", "bar", []},
                                      {"1b", "bar", []}]}},
-    etap:is(
-        {[TwoChildSibs], no_conflicts},
-        couch_key_tree:merge([TwoChildSibs], TwoChildSibs, 10),
-        "Merging a tree to itself is itself."),
-
-    TwoChildPlusSibs =
-        {1, {"1","foo", [{"1a", "bar", [{"1aa", "bar", []}]},
-                         {"1b", "bar", []}]}},
-
-    etap:is(
-        {[TwoChildPlusSibs], no_conflicts},
-        couch_key_tree:merge([TwoChild], TwoChildSibs, 10),
-        "Merging tree of uneven length at node 2."),
 
     Stemmed1b = {2, {"1a", "bar", []}},
     etap:is(
-        {[TwoChildSibs], no_conflicts},
+        {[TwoChildSibs], internal_node},
         couch_key_tree:merge([TwoChildSibs], Stemmed1b, 10),
         "Merging a tree with a stem."
     ),
@@ -95,7 +82,7 @@ test() ->
                                      {"1b", "bar", [{"1bb", "boo", []}]}]}},
     Stemmed1bb = {3, {"1bb", "boo", []}},
     etap:is(
-        {[TwoChildSibs2], no_conflicts},
+        {[TwoChildSibs2], internal_node},
         couch_key_tree:merge([TwoChildSibs2], Stemmed1bb, 10),
         "Merging a stem at a deeper level."
     ),
@@ -104,27 +91,27 @@ test() ->
                             {2,{"1b", "bar", [{"1bb", "boo", []}]}}],
 
     etap:is(
-        {StemmedTwoChildSibs2, no_conflicts},
+        {StemmedTwoChildSibs2, internal_node},
         couch_key_tree:merge(StemmedTwoChildSibs2, Stemmed1bb, 10),
         "Merging a stem at a deeper level against paths at deeper levels."
     ),
 
     Stemmed1aa = {3, {"1aa", "bar", []}},
     etap:is(
-        {[TwoChild], no_conflicts},
+        {[TwoChild], internal_node},
         couch_key_tree:merge([TwoChild], Stemmed1aa, 10),
         "Merging a single tree with a deeper stem."
     ),
 
     Stemmed1a = {2, {"1a", "bar", [{"1aa", "bar", []}]}},
     etap:is(
-        {[TwoChild], no_conflicts},
+        {[TwoChild], internal_node},
         couch_key_tree:merge([TwoChild], Stemmed1a, 10),
         "Merging a larger stem."
     ),
 
     etap:is(
-        {[Stemmed1a], no_conflicts},
+        {[Stemmed1a], internal_node},
         couch_key_tree:merge([Stemmed1a], Stemmed1aa, 10),
         "More merging."
     ),
@@ -132,13 +119,13 @@ test() ->
     OneChild = {1, {"1","foo",[{"1a", "bar", []}]}},
     Expect1 = [OneChild, Stemmed1aa],
     etap:is(
-        {Expect1, conflicts},
+        {Expect1, new_branch},
         couch_key_tree:merge([OneChild], Stemmed1aa, 10),
         "Merging should create conflicts."
     ),
 
     etap:is(
-        {[TwoChild], no_conflicts},
+        {[TwoChild], new_leaf},
         couch_key_tree:merge(Expect1, TwoChild, 10),
         "Merge should have no conflicts."
     ),
@@ -168,9 +155,21 @@ test() ->
                ]}},
 
     etap:is(
-      {[FooBar], no_conflicts},
+      {[FooBar], new_leaf},
       couch_key_tree:merge([Foo],Bar,10),
       "Merging trees with conflicts ought to behave."
     ),
 
+    etap:is(
+      {[TwoChild], internal_node},
+      couch_key_tree:merge([TwoChild],One,10),
+      "Merging tree with already-existing path."
+    ),
+
+    etap:is(
+      {[TwoChildSibs], internal_node},
+      couch_key_tree:merge([TwoChildSibs],One,10),
+      "Merging tree with already-existing path with siblings."
+    ),
+
     ok.