This is an automated email from the ASF dual-hosted git repository.

jiangphcn pushed a commit to branch 
COUCHDB-3326-clustered-purge-pr5-implementation
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to 
refs/heads/COUCHDB-3326-clustered-purge-pr5-implementation by this push:
     new 53fe4b9  Address koco's comments on commits 01 02 and 03
53fe4b9 is described below

commit 53fe4b92de1a89dbbb8a3319c710be4448cd5dfe
Author: jiangphcn <[email protected]>
AuthorDate: Wed Jun 13 11:56:27 2018 +0800

    Address koco's comments on commits 01 02 and 03
    
      - add enum for purge_fold_options
      - use ?LOCAL_DOC_PREFIX in FoldFun
      - add check with erlang:function_exported/3 in get_purge_client_fun/2
      - move purge_tree_state upgrade from 0 to nil to upgrade_purge_info/2
    
    COUCHDB-3326
---
 src/couch/src/couch_bt_engine.erl | 68 +++++++++++++++++++++------------------
 src/couch/src/couch_db.erl        | 16 ++++++---
 src/couch/src/couch_db_engine.erl |  7 ++--
 3 files changed, 53 insertions(+), 38 deletions(-)

diff --git a/src/couch/src/couch_bt_engine.erl 
b/src/couch/src/couch_bt_engine.erl
index 7fbc0a9..fc86b13 100644
--- a/src/couch/src/couch_bt_engine.erl
+++ b/src/couch/src/couch_bt_engine.erl
@@ -814,10 +814,7 @@ init_state(FilePath, Fd, Header0, Options) ->
             {compression, Compression}
         ]),
 
-    PurgeTreeState = case couch_bt_engine_header:purge_tree_state(Header) of
-        0 -> nil;
-        PTS -> PTS
-    end,
+    PurgeTreeState = couch_bt_engine_header:purge_tree_state(Header),
     {ok, PurgeTree} = couch_btree:open(PurgeTreeState, Fd, [
         {split, fun ?MODULE:purge_tree_split/1},
         {join, fun ?MODULE:purge_tree_join/2},
@@ -903,34 +900,41 @@ upgrade_purge_info(Fd, Header) ->
             % Pointer to old purged ids/revs is in purge_seq_tree_state
             Ptr = couch_bt_engine_header:get(Header, purge_seq_tree_state),
 
-            case Ptr of nil -> Header; _ ->
-                {ok, PurgedIdsRevs} = couch_file:pread_term(Fd, Ptr),
-
-                {Infos, NewSeq} = lists:foldl(fun({Id, Revs}, {InfoAcc, PSeq}) 
->
-                    Info = {PSeq, couch_uuids:random(), Id, Revs},
-                    {[Info | InfoAcc], PSeq + 1}
-                end, {[], PurgeSeq}, PurgedIdsRevs),
-
-                {ok, PurgeTree} = couch_btree:open(nil, Fd, [
-                    {split, fun ?MODULE:purge_tree_split/1},
-                    {join, fun ?MODULE:purge_tree_join/2},
-                    {reduce, fun ?MODULE:purge_tree_reduce/2}
-                ]),
-                {ok, PurgeTree2} = couch_btree:add(PurgeTree, Infos),
-                PurgeTreeSt = couch_btree:get_state(PurgeTree2),
-
-                {ok, PurgeSeqTree} = couch_btree:open(nil, Fd, [
-                    {split, fun ?MODULE:purge_seq_tree_split/1},
-                    {join, fun ?MODULE:purge_seq_tree_join/2},
-                    {reduce, fun ?MODULE:purge_tree_reduce/2}
-                ]),
-                {ok, PurgeSeqTree2} = couch_btree:add(PurgeSeqTree, Infos),
-                PurgeSeqTreeSt = couch_btree:get_state(PurgeSeqTree2),
-
-                couch_bt_engine_header:set(Header, [
-                    {purge_tree_state, PurgeTreeSt},
-                    {purge_seq_tree_state, PurgeSeqTreeSt}
-                ])
+            case Ptr of
+                nil ->
+                    PTS1 = couch_bt_engine_header:purge_tree_state(Header),
+                    PurgeTreeSt = case PTS1 of 0 -> nil; PTS -> PTS end,
+                    couch_bt_engine_header:set(Header, [
+                        {purge_tree_state, PurgeTreeSt}
+                    ]);
+                _ ->
+                    {ok, PurgedIdsRevs} = couch_file:pread_term(Fd, Ptr),
+
+                    {Infos, NewSeq} = lists:foldl(fun({Id, Revs}, {InfoAcc, 
PSeq}) ->
+                        Info = {PSeq, couch_uuids:random(), Id, Revs},
+                        {[Info | InfoAcc], PSeq + 1}
+                    end, {[], PurgeSeq}, PurgedIdsRevs),
+
+                    {ok, PurgeTree} = couch_btree:open(nil, Fd, [
+                        {split, fun ?MODULE:purge_tree_split/1},
+                        {join, fun ?MODULE:purge_tree_join/2},
+                        {reduce, fun ?MODULE:purge_tree_reduce/2}
+                    ]),
+                    {ok, PurgeTree2} = couch_btree:add(PurgeTree, Infos),
+                    PurgeTreeSt = couch_btree:get_state(PurgeTree2),
+
+                    {ok, PurgeSeqTree} = couch_btree:open(nil, Fd, [
+                        {split, fun ?MODULE:purge_seq_tree_split/1},
+                        {join, fun ?MODULE:purge_seq_tree_join/2},
+                        {reduce, fun ?MODULE:purge_tree_reduce/2}
+                    ]),
+                    {ok, PurgeSeqTree2} = couch_btree:add(PurgeSeqTree, Infos),
+                    PurgeSeqTreeSt = couch_btree:get_state(PurgeSeqTree2),
+
+                    couch_bt_engine_header:set(Header, [
+                        {purge_tree_state, PurgeTreeSt},
+                        {purge_seq_tree_state, PurgeSeqTreeSt}
+                    ])
             end
     end.
 
diff --git a/src/couch/src/couch_db.erl b/src/couch/src/couch_db.erl
index f1fee82..d0f1e21 100644
--- a/src/couch/src/couch_db.erl
+++ b/src/couch/src/couch_db.erl
@@ -423,7 +423,7 @@ get_minimum_purge_seq(#db{} = Db) ->
 
     FoldFun = fun(#doc{id = DocId, body = {Props}}, SeqAcc) ->
         case DocId of
-            <<"_local/purge-", _/binary>> ->
+            <<?LOCAL_DOC_PREFIX, "purge-", _/binary>> ->
                 ClientSeq = couch_util:get_value(<<"purge_seq">>, Props),
                 case ClientSeq of
                     CS when is_integer(CS), CS >= PurgeSeq - PurgeInfosLimit ->
@@ -504,10 +504,18 @@ get_purge_client_fun(DocId, Props) ->
     F0 = couch_util:get_value(<<"verify_function">>, Props),
     try
         F = binary_to_existing_atom(F0, latin1),
-        fun M:F/2
+        case erlang:function_exported(M, F, 2) of
+            true ->
+                fun M:F/2;
+            false ->
+                Fmt2 = "Missing exported function '~p' in '~p'
+                    for purge checkpoint '~s'",
+                couch_log:error(Fmt2, [F0, M0, DocId]),
+                throw(failed)
+        end
     catch error:badarg ->
-        Fmt2 = "Missing function '~p' in '~p' for purge checkpoint '~s'",
-        couch_log:error(Fmt2, [F0, M0, DocId]),
+        Fmt3 = "Missing function '~p' in '~p' for purge checkpoint '~s'",
+        couch_log:error(Fmt3, [F0, M0, DocId]),
         throw(failed)
     end.
 
diff --git a/src/couch/src/couch_db_engine.erl 
b/src/couch/src/couch_db_engine.erl
index 7529f60..385156c 100644
--- a/src/couch/src/couch_db_engine.erl
+++ b/src/couch/src/couch_db_engine.erl
@@ -65,8 +65,11 @@
     ].
 
 -type purge_fold_options() :: [
-    % Need to enumerate these
-].
+        {start_key, Key::any()} |
+        {end_key, Key::any()} |
+        {end_key_gt, Key::any()} |
+        {dir, fwd | rev}
+    ].
 
 -type db_handle() :: any().
 

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to