You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ko...@apache.org on 2010/12/29 04:19:18 UTC

svn commit: r1053519 - in /couchdb/branches/1.0.x: src/couchdb/couch_db.erl src/couchdb/couch_db_updater.erl src/couchdb/couch_key_tree.erl test/etap/060-kt-merging.t

Author: kocolosk
Date: Wed Dec 29 03:19:17 2010
New Revision: 1053519

URL: http://svn.apache.org/viewvc?rev=1053519&view=rev
Log:
Stem revision trees after merging a path, COUCHDB-968

Modified:
    couchdb/branches/1.0.x/src/couchdb/couch_db.erl
    couchdb/branches/1.0.x/src/couchdb/couch_db_updater.erl
    couchdb/branches/1.0.x/src/couchdb/couch_key_tree.erl
    couchdb/branches/1.0.x/test/etap/060-kt-merging.t

Modified: couchdb/branches/1.0.x/src/couchdb/couch_db.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/src/couchdb/couch_db.erl?rev=1053519&r1=1053518&r2=1053519&view=diff
==============================================================================
--- couchdb/branches/1.0.x/src/couchdb/couch_db.erl (original)
+++ couchdb/branches/1.0.x/src/couchdb/couch_db.erl Wed Dec 29 03:19:17 2010
@@ -555,7 +555,8 @@ prep_and_validate_replicated_updates(Db,
     {ok, #full_doc_info{rev_tree=OldTree}} ->
         NewRevTree = lists:foldl(
             fun(NewDoc, AccTree) ->
-                {NewTree, _} = couch_key_tree:merge(AccTree, couch_db:doc_to_tree(NewDoc)),
+                {NewTree, _} = couch_key_tree:merge(AccTree,
+                    couch_db:doc_to_tree(NewDoc), Db#db.revs_limit),
                 NewTree
             end,
             OldTree, Bucket),

Modified: couchdb/branches/1.0.x/src/couchdb/couch_db_updater.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/src/couchdb/couch_db_updater.erl?rev=1053519&r1=1053518&r2=1053519&view=diff
==============================================================================
--- couchdb/branches/1.0.x/src/couchdb/couch_db_updater.erl (original)
+++ couchdb/branches/1.0.x/src/couchdb/couch_db_updater.erl Wed Dec 29 03:19:17 2010
@@ -495,10 +495,11 @@ merge_rev_trees(Limit, MergeConflicts, [
         [OldDocInfo|RestOldInfo], AccNewInfos, AccRemoveSeqs, AccSeq) ->
     #full_doc_info{id=Id,rev_tree=OldTree,deleted=OldDeleted,update_seq=OldSeq}
             = OldDocInfo,
-    NewRevTree0 = lists:foldl(
+    NewRevTree = lists:foldl(
         fun({Client, #doc{revs={Pos,[_Rev|PrevRevs]}}=NewDoc}, AccTree) ->
             if not MergeConflicts ->
-                case couch_key_tree:merge(AccTree, couch_db:doc_to_tree(NewDoc)) of
+                case couch_key_tree:merge(AccTree, couch_db:doc_to_tree(NewDoc),
+                    Limit) of
                 {_NewTree, conflicts} when (not OldDeleted) ->
                     send_result(Client, Id, {Pos-1,PrevRevs}, conflict),
                     AccTree;
@@ -529,7 +530,7 @@ merge_rev_trees(Limit, MergeConflicts, [
                                 NewDoc#doc{revs={OldPos, [OldRev]}}),
                         NewDoc2 = NewDoc#doc{revs={OldPos + 1, [NewRevId, OldRev]}},
                         {NewTree2, _} = couch_key_tree:merge(AccTree,
-                                couch_db:doc_to_tree(NewDoc2)),
+                                couch_db:doc_to_tree(NewDoc2), Limit),
                         % we changed the rev id, this tells the caller we did
                         send_result(Client, Id, {Pos-1,PrevRevs},
                                 {ok, {OldPos + 1, NewRevId}}),
@@ -543,12 +544,11 @@ merge_rev_trees(Limit, MergeConflicts, [
                 end;
             true ->
                 {NewTree, _} = couch_key_tree:merge(AccTree,
-                            couch_db:doc_to_tree(NewDoc)),
+                            couch_db:doc_to_tree(NewDoc), Limit),
                 NewTree
             end
         end,
         OldTree, NewDocs),
-    NewRevTree = couch_key_tree:stem(NewRevTree0, Limit),
     if NewRevTree == OldTree ->
         % nothing changed
         merge_rev_trees(Limit, MergeConflicts, RestDocsList, RestOldInfo,

Modified: couchdb/branches/1.0.x/src/couchdb/couch_key_tree.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/src/couchdb/couch_key_tree.erl?rev=1053519&r1=1053518&r2=1053519&view=diff
==============================================================================
--- couchdb/branches/1.0.x/src/couchdb/couch_key_tree.erl (original)
+++ couchdb/branches/1.0.x/src/couchdb/couch_key_tree.erl Wed Dec 29 03:19:17 2010
@@ -12,7 +12,7 @@
 
 -module(couch_key_tree).
 
--export([merge/2, find_missing/2, get_key_leafs/2, get_full_key_paths/2, get/2]).
+-export([merge/3, find_missing/2, get_key_leafs/2, get_full_key_paths/2, get/2]).
 -export([map/2, get_all_leafs/1, count_leafs/1, remove_leafs/2,
     get_all_leafs_full/1,stem/2,map_leafs/2]).
 
@@ -23,6 +23,12 @@
 
 % partial trees arranged by how much they are cut off.
 
+-spec merge([path()], path(), pos_integer()) -> {[path()],
+    conflicts | no_conflicts}.
+merge(Paths, Path, Depth) ->
+    {Merged, Conflicts} = merge(Paths, Path),
+    {stem(Merged, Depth), Conflicts}.
+
 -spec merge([path()], path()) -> {[path()], conflicts | no_conflicts}.
 merge(Paths, Path) ->
     {ok, Merged, HasConflicts} = merge_one(Paths, Path, [], false),

Modified: couchdb/branches/1.0.x/test/etap/060-kt-merging.t
URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/test/etap/060-kt-merging.t?rev=1053519&r1=1053518&r2=1053519&view=diff
==============================================================================
--- couchdb/branches/1.0.x/test/etap/060-kt-merging.t (original)
+++ couchdb/branches/1.0.x/test/etap/060-kt-merging.t Wed Dec 29 03:19:17 2010
@@ -15,7 +15,7 @@
 
 main(_) ->
     test_util:init_code_path(),
-    etap:plan(14),
+    etap:plan(12),
     case (catch test()) of
         ok ->
             etap:end_tests();
@@ -42,77 +42,74 @@ test() ->
 
     etap:is(
         {[One], no_conflicts},
-        couch_key_tree:merge([], One),
+        couch_key_tree:merge([], One, 10),
         "The empty tree is the identity for merge."
     ),
 
     etap:is(
         {TwoSibs, no_conflicts},
-        couch_key_tree:merge(TwoSibs, One),
+        couch_key_tree:merge(TwoSibs, One, 10),
         "Merging a prefix of a tree with the tree yields the tree."
     ),
 
     etap:is(
         {[One], no_conflicts},
-        couch_key_tree:merge([One], One),
+        couch_key_tree:merge([One], One, 10),
         "Merging is reflexive."
     ),
 
     etap:is(
         {[TwoChild], no_conflicts},
-        couch_key_tree:merge([TwoChild], TwoChild),
+        couch_key_tree:merge([TwoChild], TwoChild, 10),
         "Merging two children is still reflexive."
     ),
 
     etap:is(
         {[TwoChildSibs], no_conflicts},
-        couch_key_tree:merge([TwoChildSibs], TwoChildSibs),
+        couch_key_tree:merge([TwoChildSibs], TwoChildSibs, 10),
         "Merging a tree to itself is itself."),
 
     etap:is(
         {[TwoChildSibs], no_conflicts},
-        couch_key_tree:merge([TwoChildSibs], Stemmed1b),
+        couch_key_tree:merge([TwoChildSibs], Stemmed1b, 10),
         "Merging a tree with a stem."
     ),
 
     etap:is(
         {[TwoChildSibs2], no_conflicts},
-        couch_key_tree:merge([TwoChildSibs2], Stemmed1bb),
+        couch_key_tree:merge([TwoChildSibs2], Stemmed1bb, 10),
         "Merging a stem at a deeper level."
     ),
 
     etap:is(
         {[TwoChild], no_conflicts},
-        couch_key_tree:merge([TwoChild], Stemmed1aa),
+        couch_key_tree:merge([TwoChild], Stemmed1aa, 10),
         "Merging a single tree with a deeper stem."
     ),
 
     etap:is(
         {[TwoChild], no_conflicts},
-        couch_key_tree:merge([TwoChild], Stemmed1a),
+        couch_key_tree:merge([TwoChild], Stemmed1a, 10),
         "Merging a larger stem."
     ),
 
     etap:is(
         {[Stemmed1a], no_conflicts},
-        couch_key_tree:merge([Stemmed1a], Stemmed1aa),
+        couch_key_tree:merge([Stemmed1a], Stemmed1aa, 10),
         "More merging."
     ),
 
     Expect1 = [OneChild, Stemmed1aa],
     etap:is(
         {Expect1, conflicts},
-        couch_key_tree:merge([OneChild], Stemmed1aa),
+        couch_key_tree:merge([OneChild], Stemmed1aa, 10),
         "Merging should create conflicts."
     ),
 
-    {MultiPaths, NoConflicts} = couch_key_tree:merge(Expect1, TwoChild),
-    etap:is(NoConflicts, no_conflicts, "Merge should have no conflicts."),
-    etap:is(length(MultiPaths), 2, "Should have two paths before stemming."),
-    etap:is(
-        couch_key_tree:stem(MultiPaths, 10),
-        [TwoChild],
-        "Stemming should collapse the paths."
+    etap:is(
+        {[TwoChild], no_conflicts},
+        couch_key_tree:merge(Expect1, TwoChild, 10),
+        "Merge should have no conflicts."
     ),
 
     ok.



Re: svn commit: r1053519 - in /couchdb/branches/1.0.x: src/couchdb/couch_db.erl src/couchdb/couch_db_updater.erl src/couchdb/couch_key_tree.erl test/etap/060-kt-merging.t

Posted by Sebastian Cohnen <se...@googlemail.com>.
could someone take care of COUCHDB-993 too? It is still causing trouble for my test case.


On 29.12.2010, at 04:19, kocolosk@apache.org wrote:

> Author: kocolosk
> Date: Wed Dec 29 03:19:17 2010
> New Revision: 1053519
> 
> URL: http://svn.apache.org/viewvc?rev=1053519&view=rev
> Log:
> Stem revision trees after merging a path, COUCHDB-968
> 
> Modified:
> couchdb/branches/1.0.x/src/couchdb/couch_db.erl
> couchdb/branches/1.0.x/src/couchdb/couch_db_updater.erl
> couchdb/branches/1.0.x/src/couchdb/couch_key_tree.erl
> couchdb/branches/1.0.x/test/etap/060-kt-merging.t
> 
> Modified: couchdb/branches/1.0.x/src/couchdb/couch_db.erl
> URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/src/couchdb/couch_db.erl?rev=1053519&r1=1053518&r2=1053519&view=diff
> ==============================================================================
> --- couchdb/branches/1.0.x/src/couchdb/couch_db.erl (original)
> +++ couchdb/branches/1.0.x/src/couchdb/couch_db.erl Wed Dec 29 03:19:17 2010
> @@ -555,7 +555,8 @@ prep_and_validate_replicated_updates(Db,
> {ok, #full_doc_info{rev_tree=OldTree}} ->
>    NewRevTree = lists:foldl(
>        fun(NewDoc, AccTree) ->
> -                {NewTree, _} = couch_key_tree:merge(AccTree, couch_db:doc_to_tree(NewDoc)),
> +                {NewTree, _} = couch_key_tree:merge(AccTree,
> +                    couch_db:doc_to_tree(NewDoc), Db#db.revs_limit),
>            NewTree
>        end,
>        OldTree, Bucket),
> 
> Modified: couchdb/branches/1.0.x/src/couchdb/couch_db_updater.erl
> URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/src/couchdb/couch_db_updater.erl?rev=1053519&r1=1053518&r2=1053519&view=diff
> ==============================================================================
> --- couchdb/branches/1.0.x/src/couchdb/couch_db_updater.erl (original)
> +++ couchdb/branches/1.0.x/src/couchdb/couch_db_updater.erl Wed Dec 29 03:19:17 2010
> @@ -495,10 +495,11 @@ merge_rev_trees(Limit, MergeConflicts, [
>    [OldDocInfo|RestOldInfo], AccNewInfos, AccRemoveSeqs, AccSeq) ->
> #full_doc_info{id=Id,rev_tree=OldTree,deleted=OldDeleted,update_seq=OldSeq}
>        = OldDocInfo,
> -    NewRevTree0 = lists:foldl(
> +    NewRevTree = lists:foldl(
>    fun({Client, #doc{revs={Pos,[_Rev|PrevRevs]}}=NewDoc}, AccTree) ->
>        if not MergeConflicts ->
> -                case couch_key_tree:merge(AccTree, couch_db:doc_to_tree(NewDoc)) of
> +                case couch_key_tree:merge(AccTree, couch_db:doc_to_tree(NewDoc),
> +                    Limit) of
>            {_NewTree, conflicts} when (not OldDeleted) ->
>                send_result(Client, Id, {Pos-1,PrevRevs}, conflict),
>                AccTree;
> @@ -529,7 +530,7 @@ merge_rev_trees(Limit, MergeConflicts, [
>                            NewDoc#doc{revs={OldPos, [OldRev]}}),
>                    NewDoc2 = NewDoc#doc{revs={OldPos + 1, [NewRevId, OldRev]}},
>                    {NewTree2, _} = couch_key_tree:merge(AccTree,
> -                                couch_db:doc_to_tree(NewDoc2)),
> +                                couch_db:doc_to_tree(NewDoc2), Limit),
>                    % we changed the rev id, this tells the caller we did
>                    send_result(Client, Id, {Pos-1,PrevRevs},
>                            {ok, {OldPos + 1, NewRevId}}),
> @@ -543,12 +544,11 @@ merge_rev_trees(Limit, MergeConflicts, [
>            end;
>        true ->
>            {NewTree, _} = couch_key_tree:merge(AccTree,
> -                            couch_db:doc_to_tree(NewDoc)),
> +                            couch_db:doc_to_tree(NewDoc), Limit),
>            NewTree
>        end
>    end,
>    OldTree, NewDocs),
> -    NewRevTree = couch_key_tree:stem(NewRevTree0, Limit),
> if NewRevTree == OldTree ->
>    % nothing changed
>    merge_rev_trees(Limit, MergeConflicts, RestDocsList, RestOldInfo,
> 
> Modified: couchdb/branches/1.0.x/src/couchdb/couch_key_tree.erl
> URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/src/couchdb/couch_key_tree.erl?rev=1053519&r1=1053518&r2=1053519&view=diff
> ==============================================================================
> --- couchdb/branches/1.0.x/src/couchdb/couch_key_tree.erl (original)
> +++ couchdb/branches/1.0.x/src/couchdb/couch_key_tree.erl Wed Dec 29 03:19:17 2010
> @@ -12,7 +12,7 @@
> 
> -module(couch_key_tree).
> 
> --export([merge/2, find_missing/2, get_key_leafs/2, get_full_key_paths/2, get/2]).
> +-export([merge/3, find_missing/2, get_key_leafs/2, get_full_key_paths/2, get/2]).
> -export([map/2, get_all_leafs/1, count_leafs/1, remove_leafs/2,
> get_all_leafs_full/1,stem/2,map_leafs/2]).
> 
> @@ -23,6 +23,12 @@
> 
> % partial trees arranged by how much they are cut off.
> 
> +-spec merge([path()], path(), pos_integer()) -> {[path()],
> +    conflicts | no_conflicts}.
> +merge(Paths, Path, Depth) ->
> +    {Merged, Conflicts} = merge(Paths, Path),
> +    {stem(Merged, Depth), Conflicts}.
> +
> -spec merge([path()], path()) -> {[path()], conflicts | no_conflicts}.
> merge(Paths, Path) ->
> {ok, Merged, HasConflicts} = merge_one(Paths, Path, [], false),
> 
> Modified: couchdb/branches/1.0.x/test/etap/060-kt-merging.t
> URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/test/etap/060-kt-merging.t?rev=1053519&r1=1053518&r2=1053519&view=diff
> ==============================================================================
> --- couchdb/branches/1.0.x/test/etap/060-kt-merging.t (original)
> +++ couchdb/branches/1.0.x/test/etap/060-kt-merging.t Wed Dec 29 03:19:17 2010
> @@ -15,7 +15,7 @@
> 
> main(_) ->
> test_util:init_code_path(),
> -    etap:plan(14),
> +    etap:plan(12),
> case (catch test()) of
>    ok ->
>        etap:end_tests();
> @@ -42,77 +42,74 @@ test() ->
> 
> etap:is(
>    {[One], no_conflicts},
> -        couch_key_tree:merge([], One),
> +        couch_key_tree:merge([], One, 10),
>    "The empty tree is the identity for merge."
> ),
> 
> etap:is(
>    {TwoSibs, no_conflicts},
> -        couch_key_tree:merge(TwoSibs, One),
> +        couch_key_tree:merge(TwoSibs, One, 10),
>    "Merging a prefix of a tree with the tree yields the tree."
> ),
> 
> etap:is(
>    {[One], no_conflicts},
> -        couch_key_tree:merge([One], One),
> +        couch_key_tree:merge([One], One, 10),
>    "Merging is reflexive."
> ),
> 
> etap:is(
>    {[TwoChild], no_conflicts},
> -        couch_key_tree:merge([TwoChild], TwoChild),
> +        couch_key_tree:merge([TwoChild], TwoChild, 10),
>    "Merging two children is still reflexive."
> ),
> 
> etap:is(
>    {[TwoChildSibs], no_conflicts},
> -        couch_key_tree:merge([TwoChildSibs], TwoChildSibs),
> +        couch_key_tree:merge([TwoChildSibs], TwoChildSibs, 10),
>    "Merging a tree to itself is itself."),
> 
> etap:is(
>    {[TwoChildSibs], no_conflicts},
> -        couch_key_tree:merge([TwoChildSibs], Stemmed1b),
> +        couch_key_tree:merge([TwoChildSibs], Stemmed1b, 10),
>    "Merging a tree with a stem."
> ),
> 
> etap:is(
>    {[TwoChildSibs2], no_conflicts},
> -        couch_key_tree:merge([TwoChildSibs2], Stemmed1bb),
> +        couch_key_tree:merge([TwoChildSibs2], Stemmed1bb, 10),
>    "Merging a stem at a deeper level."
> ),
> 
> etap:is(
>    {[TwoChild], no_conflicts},
> -        couch_key_tree:merge([TwoChild], Stemmed1aa),
> +        couch_key_tree:merge([TwoChild], Stemmed1aa, 10),
>    "Merging a single tree with a deeper stem."
> ),
> 
> etap:is(
>    {[TwoChild], no_conflicts},
> -        couch_key_tree:merge([TwoChild], Stemmed1a),
> +        couch_key_tree:merge([TwoChild], Stemmed1a, 10),
>    "Merging a larger stem."
> ),
> 
> etap:is(
>    {[Stemmed1a], no_conflicts},
> -        couch_key_tree:merge([Stemmed1a], Stemmed1aa),
> +        couch_key_tree:merge([Stemmed1a], Stemmed1aa, 10),
>    "More merging."
> ),
> 
> Expect1 = [OneChild, Stemmed1aa],
> etap:is(
>    {Expect1, conflicts},
> -        couch_key_tree:merge([OneChild], Stemmed1aa),
> +        couch_key_tree:merge([OneChild], Stemmed1aa, 10),
>    "Merging should create conflicts."
> ),
> 
> -    {MultiPaths, NoConflicts} = couch_key_tree:merge(Expect1, TwoChild),
> -    etap:is(NoConflicts, no_conflicts, "Merge should have no conflicts."),
> -    etap:is(length(MultiPaths), 2, "Should have two paths before stemming."),
> -    etap:is(
> -        couch_key_tree:stem(MultiPaths, 10),
> -        [TwoChild],
> -        "Stemming should collapse the paths."
> +    etap:is(
> +        {[TwoChild], no_conflicts},
> +        couch_key_tree:merge(Expect1, TwoChild, 10),
> +        "Merge should have no conflicts."
> ),
> 
> ok.
> 
>