This is an automated email from the ASF dual-hosted git repository.
vatamane pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git
The following commit(s) were added to refs/heads/main by this push:
new 1a2dfc9c8 DRY out couch_bt_engine header pointer term access
1a2dfc9c8 is described below
commit 1a2dfc9c8a574974524279f8d09cd67f8c8f1668
Author: Nick Vatamaniuc <[email protected]>
AuthorDate: Tue Aug 5 18:58:36 2025 -0400
DRY out couch_bt_engine header pointer term access
Our header pointer term operations seem a bit too verbose, so "DRY" them
out a
bit with some common functions. There is no new functionality added or
changed,
this is a pure refactoring.
During the refactoring, with all the plain atom field names, I had managed
to
slip through a few typos, so to help with that in the future, turned some of
them into defines so the compiler can do the checking for us.
---
src/couch/src/couch_bt_engine.erl | 135 +++++++++++++++++---------------------
1 file changed, 59 insertions(+), 76 deletions(-)
diff --git a/src/couch/src/couch_bt_engine.erl
b/src/couch/src/couch_bt_engine.erl
index 88b0de98f..180c99e36 100644
--- a/src/couch/src/couch_bt_engine.erl
+++ b/src/couch/src/couch_bt_engine.erl
@@ -114,6 +114,14 @@
-include_lib("couch/include/couch_db.hrl").
-include("couch_bt_engine.hrl").
+% Commonly used header fields (used more than once in this module)
+-define(UPDATE_SEQ, update_seq).
+-define(SECURITY_PTR, security_ptr).
+-define(PROPS_PTR, props_ptr).
+-define(REVS_LIMIT, revs_limit).
+-define(PURGE_INFOS_LIMIT, purge_infos_limit).
+-define(COMPACTED_SEQ, compacted_seq).
+
exists(FilePath) ->
case is_file(FilePath) of
true ->
@@ -211,7 +219,7 @@ monitored_by(St) ->
end.
get_compacted_seq(#st{header = Header}) ->
- couch_bt_engine_header:get(Header, compacted_seq).
+ couch_bt_engine_header:get(Header, ?COMPACTED_SEQ).
get_del_doc_count(#st{} = St) ->
{ok, Reds} = couch_btree:full_reduce(St#st.id_tree),
@@ -242,10 +250,10 @@ get_oldest_purge_seq(#st{purge_seq_tree = PurgeSeqTree})
->
PurgeSeq.
get_purge_infos_limit(#st{header = Header}) ->
- couch_bt_engine_header:get(Header, purge_infos_limit).
+ couch_bt_engine_header:get(Header, ?PURGE_INFOS_LIMIT).
get_revs_limit(#st{header = Header}) ->
- couch_bt_engine_header:get(Header, revs_limit).
+ couch_bt_engine_header:get(Header, ?REVS_LIMIT).
get_size_info(#st{} = St) ->
{ok, FileSize} = couch_file:bytes(St#st.fd),
@@ -305,26 +313,14 @@ get_partition_info(#st{} = St, Partition) ->
]}
].
-get_security(#st{header = Header} = St) ->
- case couch_bt_engine_header:get(Header, security_ptr) of
- undefined ->
- [];
- Pointer ->
- {ok, SecProps} = couch_file:pread_term(St#st.fd, Pointer),
- SecProps
- end.
+get_security(#st{} = St) ->
+ get_header_term(St, ?SECURITY_PTR, []).
-get_props(#st{header = Header} = St) ->
- case couch_bt_engine_header:get(Header, props_ptr) of
- undefined ->
- [];
- Pointer ->
- {ok, Props} = couch_file:pread_term(St#st.fd, Pointer),
- Props
- end.
+get_props(#st{} = St) ->
+ get_header_term(St, ?PROPS_PTR, []).
get_update_seq(#st{header = Header}) ->
- couch_bt_engine_header:get(Header, update_seq).
+ couch_bt_engine_header:get(Header, ?UPDATE_SEQ).
get_uuid(#st{header = Header}) ->
couch_bt_engine_header:get(Header, uuid).
@@ -332,7 +328,7 @@ get_uuid(#st{header = Header}) ->
set_revs_limit(#st{header = Header} = St, RevsLimit) ->
NewSt = St#st{
header = couch_bt_engine_header:set(Header, [
- {revs_limit, RevsLimit}
+ {?REVS_LIMIT, RevsLimit}
]),
needs_commit = true
},
@@ -341,33 +337,17 @@ set_revs_limit(#st{header = Header} = St, RevsLimit) ->
set_purge_infos_limit(#st{header = Header} = St, PurgeInfosLimit) ->
NewSt = St#st{
header = couch_bt_engine_header:set(Header, [
- {purge_infos_limit, PurgeInfosLimit}
+ {?PURGE_INFOS_LIMIT, PurgeInfosLimit}
]),
needs_commit = true
},
{ok, increment_update_seq(NewSt)}.
-set_security(#st{header = Header} = St, NewSecurity) ->
- Options = [{compression, St#st.compression}],
- {ok, Ptr, _} = couch_file:append_term(St#st.fd, NewSecurity, Options),
- NewSt = St#st{
- header = couch_bt_engine_header:set(Header, [
- {security_ptr, Ptr}
- ]),
- needs_commit = true
- },
- {ok, increment_update_seq(NewSt)}.
+set_security(#st{} = St, NewSecurity) ->
+ {ok, increment_update_seq(set_header_term(St, ?SECURITY_PTR,
NewSecurity))}.
-set_props(#st{header = Header} = St, Props) ->
- Options = [{compression, St#st.compression}],
- {ok, Ptr, _} = couch_file:append_term(St#st.fd, Props, Options),
- NewSt = St#st{
- header = couch_bt_engine_header:set(Header, [
- {props_ptr, Ptr}
- ]),
- needs_commit = true
- },
- {ok, increment_update_seq(NewSt)}.
+set_props(#st{} = St, Props) ->
+ {ok, increment_update_seq(set_header_term(St, ?PROPS_PTR, Props))}.
open_docs(#st{} = St, DocIds) ->
Results = couch_btree:lookup(St#st.id_tree, DocIds),
@@ -487,7 +467,7 @@ write_doc_infos(#st{} = St, Pairs, LocalDocs) ->
),
NewHeader = couch_bt_engine_header:set(St#st.header, [
- {update_seq, NewUpdateSeq}
+ {?UPDATE_SEQ, NewUpdateSeq}
]),
{ok, St#st{
@@ -509,7 +489,7 @@ purge_docs(#st{} = St, Pairs, PurgeInfos) ->
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),
+ CurrSeq = couch_bt_engine_header:get(St#st.header, ?UPDATE_SEQ),
Seqs = [FDI#full_doc_info.update_seq || FDI <- DocsToAdd],
NewSeq = lists:max([CurrSeq | Seqs]),
@@ -522,7 +502,7 @@ purge_docs(#st{} = St, Pairs, PurgeInfos) ->
false -> NewSeq
end,
Header = couch_bt_engine_header:set(St#st.header, [
- {update_seq, UpdateSeq}
+ {?UPDATE_SEQ, UpdateSeq}
]),
{ok, IdTree2} = couch_btree:add_remove(IdTree, DocsToAdd, RemDocIds),
@@ -802,30 +782,16 @@ purge_tree_reduce(rereduce, Reds) ->
set_update_seq(#st{header = Header} = St, UpdateSeq) ->
{ok, St#st{
header = couch_bt_engine_header:set(Header, [
- {update_seq, UpdateSeq}
+ {?UPDATE_SEQ, UpdateSeq}
]),
needs_commit = true
}}.
-copy_security(#st{header = Header} = St, SecProps) ->
- Options = [{compression, St#st.compression}],
- {ok, Ptr, _} = couch_file:append_term(St#st.fd, SecProps, Options),
- {ok, St#st{
- header = couch_bt_engine_header:set(Header, [
- {security_ptr, Ptr}
- ]),
- needs_commit = true
- }}.
+copy_security(#st{} = St, SecProps) ->
+ {ok, set_header_term(St, ?SECURITY_PTR, SecProps)}.
-copy_props(#st{header = Header} = St, Props) ->
- Options = [{compression, St#st.compression}],
- {ok, Ptr, _} = couch_file:append_term(St#st.fd, Props, Options),
- {ok, St#st{
- header = couch_bt_engine_header:set(Header, [
- {props_ptr, Ptr}
- ]),
- needs_commit = true
- }}.
+copy_props(#st{} = St, Props) ->
+ {ok, set_header_term(St, ?PROPS_PTR, Props)}.
open_db_file(FilePath, Options) ->
case couch_file:open(FilePath, Options) of
@@ -931,22 +897,20 @@ update_header(St, Header) ->
]).
increment_update_seq(#st{header = Header} = St) ->
- UpdateSeq = couch_bt_engine_header:get(Header, update_seq),
+ UpdateSeq = couch_bt_engine_header:get(Header, ?UPDATE_SEQ),
St#st{
header = couch_bt_engine_header:set(Header, [
- {update_seq, UpdateSeq + 1}
+ {?UPDATE_SEQ, UpdateSeq + 1}
])
}.
set_default_security_object(Fd, Header, Compression, Options) ->
- case couch_bt_engine_header:get(Header, security_ptr) of
+ case couch_bt_engine_header:get(Header, ?SECURITY_PTR) of
Pointer when is_integer(Pointer) ->
Header;
_ ->
Default = couch_util:get_value(default_security_object, Options),
- AppendOpts = [{compression, Compression}],
- {ok, Ptr, _} = couch_file:append_term(Fd, Default, AppendOpts),
- couch_bt_engine_header:set(Header, security_ptr, Ptr)
+ set_header_term(Fd, Header, ?SECURITY_PTR, Default, Compression)
end.
% This function is here, and not in couch_bt_engine_header
@@ -1013,9 +977,7 @@ init_set_props(Fd, Header, Options) ->
Header;
InitialProps ->
Compression = couch_compress:get_compression_method(),
- AppendOpts = [{compression, Compression}],
- {ok, Ptr, _} = couch_file:append_term(Fd, InitialProps,
AppendOpts),
- couch_bt_engine_header:set(Header, props_ptr, Ptr)
+ set_header_term(Fd, Header, ?PROPS_PTR, InitialProps, Compression)
end.
delete_compaction_files(FilePath) ->
@@ -1188,9 +1150,9 @@ finish_compaction_int(#st{} = OldSt, #st{} = NewSt1) ->
{ok, NewSt2} = commit_data(NewSt1#st{
header = couch_bt_engine_header:set(Header, [
- {compacted_seq, get_update_seq(OldSt)},
- {revs_limit, get_revs_limit(OldSt)},
- {purge_infos_limit, get_purge_infos_limit(OldSt)}
+ {?COMPACTED_SEQ, get_update_seq(OldSt)},
+ {?REVS_LIMIT, get_revs_limit(OldSt)},
+ {?PURGE_INFOS_LIMIT, get_purge_infos_limit(OldSt)}
]),
local_tree = NewLocal2
}),
@@ -1227,3 +1189,24 @@ is_file(Path) ->
{ok, #file_info{type = directory}} -> true;
_ -> false
end.
+
+get_header_term(#st{header = Header} = St, Key, Default) when is_atom(Key) ->
+ case couch_bt_engine_header:get(Header, Key) of
+ undefined ->
+ Default;
+ Pointer when is_integer(Pointer) ->
+ {ok, Term} = couch_file:pread_term(St#st.fd, Pointer),
+ Term
+ end.
+
+set_header_term(#st{} = St, Key, Term) when is_atom(Key) ->
+ #st{fd = Fd, header = Header, compression = Compression} = St,
+ St#st{
+ header = set_header_term(Fd, Header, Key, Term, Compression),
+ needs_commit = true
+ }.
+
+set_header_term(Fd, Header, Key, Term, Compression) when is_atom(Key) ->
+ TermOpts = [{compression, Compression}],
+ {ok, Ptr, _} = couch_file:append_term(Fd, Term, TermOpts),
+ couch_bt_engine_header:set(Header, Key, Ptr).