You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2018/03/26 20:55:36 UTC
[couchdb] 05/33: WIP - couch_bt_engine stuff
This is an automated email from the ASF dual-hosted git repository.
davisp pushed a commit to branch COUCHDB-3326-clustered-purge-davisp-refactor
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 4e8ab6420f0f8db818fab809fdfecebb1af78259
Author: Paul J. Davis <pa...@gmail.com>
AuthorDate: Mon Mar 26 10:25:34 2018 -0500
WIP - couch_bt_engine stuff
---
src/couch/src/couch_bt_engine.erl | 29 +++++++++++++++--------------
src/couch/src/couch_bt_engine_compactor.erl | 17 ++++++++---------
src/couch/src/couch_bt_engine_header.erl | 2 +-
3 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/src/couch/src/couch_bt_engine.erl b/src/couch/src/couch_bt_engine.erl
index 485d21d..899a915 100644
--- a/src/couch/src/couch_bt_engine.erl
+++ b/src/couch/src/couch_bt_engine.erl
@@ -47,7 +47,6 @@
set_revs_limit/2,
set_purge_infos_limit/2,
set_security/2,
- set_purged_docs_limit/2,
open_docs/2,
open_local_docs/2,
@@ -348,7 +347,7 @@ read_doc_body(#st{} = St, #doc{} = Doc) ->
load_purge_infos(St, UUIDs) ->
- Results = couch_btree:lookup(St#st.upurge_tree, UUIDs),
+ Results = couch_btree:lookup(St#st.purge_tree, UUIDs),
lists:map(fun
({ok, Info}) -> Info;
(not_found) -> not_found
@@ -444,10 +443,10 @@ purge_docs(#st{} = St, Pairs, PurgeInfos) ->
id_tree = IdTree,
seq_tree = SeqTree,
purge_tree = PurgeTree,
- upurge_tree = UPurgeTree
+ purge_seq_tree = PurgeSeqTree
} = St,
- RemDocIds = [Old#full_doc_info.doc_id || {Old, not_found} <- Pairs],
+ RemDocIds = [Old#full_doc_info.id || {Old, not_found} <- Pairs],
RemSeqs = [Old#full_doc_info.update_seq || {Old, _} <- Pairs],
DocsToAdd = [New || {_, New} <- Pairs, New /= not_found],
CurrSeq = couch_bt_engine_header:get(St#st.header, update_seq),
@@ -458,8 +457,8 @@ purge_docs(#st{} = St, Pairs, PurgeInfos) ->
% indexers see that they need to process the new purge
% information.
UpdateSeq = case NewSeq == CurrSeq of
- true -> InitUpdateSeq + 1;
- false -> NewUpdateSeq
+ true -> CurrSeq + 1;
+ false -> NewSeq
end,
Header = couch_bt_engine_header:set(St#st.header, [
{update_seq, UpdateSeq}
@@ -470,7 +469,7 @@ purge_docs(#st{} = St, Pairs, PurgeInfos) ->
{ok, PurgeTree2} = couch_btree:add(PurgeTree, PurgeInfos),
{ok, PurgeSeqTree2} = couch_btree:add(PurgeSeqTree, PurgeInfos),
{ok, St#st{
- header = Header2,
+ header = Header,
id_tree = IdTree2,
seq_tree = SeqTree2,
purge_tree = PurgeTree2,
@@ -544,7 +543,7 @@ fold_changes(St, SinceSeq, UserFun, UserAcc, Options) ->
fold_purge_infos(St, StartSeq0, UserFun, UserAcc, Options) ->
PurgeSeqTree = St#st.purge_seq_tree,
StartSeq = StartSeq0 + 1,
- MinSeq = load_oldest_purge_seq(PurgeSeqTree),
+ MinSeq = get_oldest_purge_seq(St),
if MinSeq =< StartSeq -> ok; true ->
throw({invalid_start_purge_seq, StartSeq0})
end,
@@ -553,7 +552,7 @@ fold_purge_infos(St, StartSeq0, UserFun, UserAcc, Options) ->
end,
Opts = [{start_key, StartSeq}] ++ Options,
{ok, _, OutAcc} = couch_btree:fold(PurgeSeqTree, Wrapper, UserAcc, Opts),
- {ok, OutAcc};
+ {ok, OutAcc}.
count_changes_since(St, SinceSeq) ->
@@ -714,7 +713,7 @@ purge_tree_split({PurgeSeq, UUID, DocId, Revs}) ->
{UUID, {PurgeSeq, DocId, Revs}}.
-purge_tree_join({UUID, {PurgeSeq, DocId, Revs}}) ->
+purge_tree_join(UUID, {PurgeSeq, DocId, Revs}) ->
{PurgeSeq, UUID, DocId, Revs}.
@@ -722,7 +721,7 @@ purge_seq_tree_split({PurgeSeq, UUID, DocId, Revs}) ->
{PurgeSeq, {UUID, DocId, Revs}}.
-purge_seq_tree_join({PurgeSeq, {UUID, DocId, Revs}}) ->
+purge_seq_tree_join(PurgeSeq, {UUID, DocId, Revs}) ->
{PurgeSeq, UUID, DocId, Revs}.
@@ -897,6 +896,8 @@ upgrade_purge_info(Fd, Header) ->
Ptr when is_tuple(Ptr) ->
Header;
PurgeSeq when is_integer(PurgeSeq)->
+ % Pointer to old purged ids/revs is in purge_seq_tree_state
+ Ptr = couch_bt_engine_header:get(Header, purge_seq_tree_state),
{ok, PurgedIdsRevs} = couch_file:pread_term(Fd, Ptr),
{Infos, NewSeq} = lists:foldl(fun({Id, Revs}, {InfoAcc, PSeq}) ->
@@ -921,8 +922,8 @@ upgrade_purge_info(Fd, Header) ->
{ok, PurgeSeqTreeSt} = couch_btree:get_state(PurgeSeqTree2),
couch_bt_engine_header:set(Header, [
- {purge_tree_state, PTreeState},
- {purge_seq_tree_state, UPTreeState}
+ {purge_tree_state, PurgeTreeSt},
+ {purge_seq_tree_state, PurgeSeqTreeSt}
])
end.
@@ -1098,7 +1099,7 @@ finish_compaction_int(#st{} = OldSt, #st{} = NewSt1) ->
header = couch_bt_engine_header:set(Header, [
{compacted_seq, get_update_seq(OldSt)},
{revs_limit, get_revs_limit(OldSt)},
- {purge_infos_limit, get_purged_docs_limit(OldSt)}
+ {purge_infos_limit, get_purge_infos_limit(OldSt)}
]),
local_tree = NewLocal2
}),
diff --git a/src/couch/src/couch_bt_engine_compactor.erl b/src/couch/src/couch_bt_engine_compactor.erl
index f6e79b4..884f0fa 100644
--- a/src/couch/src/couch_bt_engine_compactor.erl
+++ b/src/couch/src/couch_bt_engine_compactor.erl
@@ -107,7 +107,6 @@ copy_purge_info(DbName, OldSt, NewSt, Retry) ->
MinPurgeSeq = couch_util:with_db(DbName, fun(Db) ->
couch_db:get_minimum_purge_seq(Db)
end),
- OldIdTree = OldSt#st.id_tree,
OldPSTree = OldSt#st.purge_seq_tree,
StartSeq = couch_bt_engine:get_purge_seq(NewSt) + 1,
BufferSize = config:get_integer(
@@ -115,7 +114,7 @@ copy_purge_info(DbName, OldSt, NewSt, Retry) ->
CheckpointAfter = config:get(
"database_compaction", "checkpoint_after", BufferSize * 10),
- EnumFun = fun(Info, _Reds, {StAcc, InfosAcc0, InfosSize, CopiedSize}) ->
+ EnumFun = fun(Info, _Reds, {StAcc0, InfosAcc, InfosSize, CopiedSize}) ->
NewInfosSize = InfosSize + ?term_size(Info),
if NewInfosSize >= BufferSize ->
StAcc1 = copy_purge_infos(
@@ -125,11 +124,11 @@ copy_purge_info(DbName, OldSt, NewSt, Retry) ->
StAcc2 = commit_compaction_data(StAcc1),
{ok, {StAcc2, [], 0, 0}};
true ->
- {ok, {StAcc2, [], 0, NewCopiedSize}}
+ {ok, {StAcc1, [], 0, NewCopiedSize}}
end;
true ->
- NewInfosAcc = [Info | InfosAcc]
- {ok, {StAcc, NewInfosAcc, NewInfosSize, CopiedSize}}
+ NewInfosAcc = [Info | InfosAcc],
+ {ok, {StAcc0, NewInfosAcc, NewInfosSize, CopiedSize}}
end
end,
@@ -140,7 +139,7 @@ copy_purge_info(DbName, OldSt, NewSt, Retry) ->
copy_purge_infos(OldSt, NewStAcc, Infos, MinPurgeSeq, Retry).
-copy_purge_docs(OldSt, NewSt, Infos, MinPurgeSeq, Retry) ->
+copy_purge_infos(OldSt, NewSt, Infos, MinPurgeSeq, Retry) ->
#st{
id_tree = OldIdTree
} = OldSt,
@@ -170,13 +169,13 @@ copy_purge_docs(OldSt, NewSt, Infos, MinPurgeSeq, Retry) ->
AllDocIds = [DocId || {_PurgeSeq, _UUID, DocId, _Revs} <- Infos],
UniqDocIds = lists:usort(AllDocIds),
{ok, OldIdResults} = couch_btree:lookup(OldIdTree, UniqDocIds),
- OldZipped = lists:zip(UniqDocIds, Results),
+ OldZipped = lists:zip(UniqDocIds, OldIdResults),
% The list of non-existant docs in the database being compacted
- MaybeRemDocIds = [DocId || {DocId, not_found} <- Zipped],
+ MaybeRemDocIds = [DocId || {DocId, not_found} <- OldZipped],
% Removing anything that exists in the partially compacted database
- {ok, NewIdResults} = couch_btree:lookup(NewIdTree, MaybeRemDocIds),
+ {ok, NewIdResults} = couch_btree:lookup(NewIdTree0, MaybeRemDocIds),
ToRemove = [Doc || Doc <- NewIdResults, Doc /= not_found],
{RemIds, RemSeqs} = lists:unzip(lists:map(fun(FDI) ->
diff --git a/src/couch/src/couch_bt_engine_header.erl b/src/couch/src/couch_bt_engine_header.erl
index 55246ac..467bb2f 100644
--- a/src/couch/src/couch_bt_engine_header.erl
+++ b/src/couch/src/couch_bt_engine_header.erl
@@ -33,7 +33,7 @@
local_tree_state/1,
purge_tree_state/1,
purge_seq_tree_state/1,
- purged_docs_limit/1,
+ purge_infos_limit/1,
security_ptr/1,
revs_limit/1,
uuid/1,
--
To stop receiving notification emails like this one, please contact
davisp@apache.org.