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

Reply via email to