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].