This is an automated email from the ASF dual-hosted git repository. vatamane pushed a commit to branch dry-out-couch-bt-engine-header-fields in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 3d6bb8c8039fb20d463848a497a271af924824db 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 | 140 +++++++++++++++++--------------------- 1 file changed, 64 insertions(+), 76 deletions(-) diff --git a/src/couch/src/couch_bt_engine.erl b/src/couch/src/couch_bt_engine.erl index 88b0de98f..9590ba42b 100644 --- a/src/couch/src/couch_bt_engine.erl +++ b/src/couch/src/couch_bt_engine.erl @@ -114,6 +114,15 @@ -include_lib("couch/include/couch_db.hrl"). -include("couch_bt_engine.hrl"). +-define(INCREMENT_UPDATE_SEQ, increment_update_seq). +% 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 +220,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 +251,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 +314,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 +329,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 +338,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) -> + set_header_term(St, ?SECURITY_PTR, NewSecurity, [?INCREMENT_UPDATE_SEQ]). -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) -> + set_header_term(St, ?PROPS_PTR, Props, [?INCREMENT_UPDATE_SEQ]). open_docs(#st{} = St, DocIds) -> Results = couch_btree:lookup(St#st.id_tree, DocIds), @@ -487,7 +468,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 +490,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 +503,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 +783,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) -> + 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) -> + set_header_term(St, ?PROPS_PTR, Props, []). open_db_file(FilePath, Options) -> case couch_file:open(FilePath, Options) of @@ -931,22 +898,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 +978,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 +1151,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 +1190,28 @@ 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, Opts) when is_atom(Key) -> + #st{fd = Fd, header = Header, compression = Compression} = St, + NewSt = St#st{ + header = set_header_term(Fd, Header, Key, Term, Compression), + needs_commit = true + }, + case proplists:get_value(?INCREMENT_UPDATE_SEQ, Opts, false) of + false -> {ok, NewSt}; + _ -> {ok, increment_update_seq(NewSt)} + end. + +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).
