Skip to content

Commit 1a2dfc9

Browse files
committed
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.
1 parent d45d4af commit 1a2dfc9

File tree

1 file changed

+59
-76
lines changed

1 file changed

+59
-76
lines changed

src/couch/src/couch_bt_engine.erl

Lines changed: 59 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,14 @@
114114
-include_lib("couch/include/couch_db.hrl").
115115
-include("couch_bt_engine.hrl").
116116

117+
% Commonly used header fields (used more than once in this module)
118+
-define(UPDATE_SEQ, update_seq).
119+
-define(SECURITY_PTR, security_ptr).
120+
-define(PROPS_PTR, props_ptr).
121+
-define(REVS_LIMIT, revs_limit).
122+
-define(PURGE_INFOS_LIMIT, purge_infos_limit).
123+
-define(COMPACTED_SEQ, compacted_seq).
124+
117125
exists(FilePath) ->
118126
case is_file(FilePath) of
119127
true ->
@@ -211,7 +219,7 @@ monitored_by(St) ->
211219
end.
212220

213221
get_compacted_seq(#st{header = Header}) ->
214-
couch_bt_engine_header:get(Header, compacted_seq).
222+
couch_bt_engine_header:get(Header, ?COMPACTED_SEQ).
215223

216224
get_del_doc_count(#st{} = St) ->
217225
{ok, Reds} = couch_btree:full_reduce(St#st.id_tree),
@@ -242,10 +250,10 @@ get_oldest_purge_seq(#st{purge_seq_tree = PurgeSeqTree}) ->
242250
PurgeSeq.
243251

244252
get_purge_infos_limit(#st{header = Header}) ->
245-
couch_bt_engine_header:get(Header, purge_infos_limit).
253+
couch_bt_engine_header:get(Header, ?PURGE_INFOS_LIMIT).
246254

247255
get_revs_limit(#st{header = Header}) ->
248-
couch_bt_engine_header:get(Header, revs_limit).
256+
couch_bt_engine_header:get(Header, ?REVS_LIMIT).
249257

250258
get_size_info(#st{} = St) ->
251259
{ok, FileSize} = couch_file:bytes(St#st.fd),
@@ -305,34 +313,22 @@ get_partition_info(#st{} = St, Partition) ->
305313
]}
306314
].
307315

308-
get_security(#st{header = Header} = St) ->
309-
case couch_bt_engine_header:get(Header, security_ptr) of
310-
undefined ->
311-
[];
312-
Pointer ->
313-
{ok, SecProps} = couch_file:pread_term(St#st.fd, Pointer),
314-
SecProps
315-
end.
316+
get_security(#st{} = St) ->
317+
get_header_term(St, ?SECURITY_PTR, []).
316318

317-
get_props(#st{header = Header} = St) ->
318-
case couch_bt_engine_header:get(Header, props_ptr) of
319-
undefined ->
320-
[];
321-
Pointer ->
322-
{ok, Props} = couch_file:pread_term(St#st.fd, Pointer),
323-
Props
324-
end.
319+
get_props(#st{} = St) ->
320+
get_header_term(St, ?PROPS_PTR, []).
325321

326322
get_update_seq(#st{header = Header}) ->
327-
couch_bt_engine_header:get(Header, update_seq).
323+
couch_bt_engine_header:get(Header, ?UPDATE_SEQ).
328324

329325
get_uuid(#st{header = Header}) ->
330326
couch_bt_engine_header:get(Header, uuid).
331327

332328
set_revs_limit(#st{header = Header} = St, RevsLimit) ->
333329
NewSt = St#st{
334330
header = couch_bt_engine_header:set(Header, [
335-
{revs_limit, RevsLimit}
331+
{?REVS_LIMIT, RevsLimit}
336332
]),
337333
needs_commit = true
338334
},
@@ -341,33 +337,17 @@ set_revs_limit(#st{header = Header} = St, RevsLimit) ->
341337
set_purge_infos_limit(#st{header = Header} = St, PurgeInfosLimit) ->
342338
NewSt = St#st{
343339
header = couch_bt_engine_header:set(Header, [
344-
{purge_infos_limit, PurgeInfosLimit}
340+
{?PURGE_INFOS_LIMIT, PurgeInfosLimit}
345341
]),
346342
needs_commit = true
347343
},
348344
{ok, increment_update_seq(NewSt)}.
349345

350-
set_security(#st{header = Header} = St, NewSecurity) ->
351-
Options = [{compression, St#st.compression}],
352-
{ok, Ptr, _} = couch_file:append_term(St#st.fd, NewSecurity, Options),
353-
NewSt = St#st{
354-
header = couch_bt_engine_header:set(Header, [
355-
{security_ptr, Ptr}
356-
]),
357-
needs_commit = true
358-
},
359-
{ok, increment_update_seq(NewSt)}.
346+
set_security(#st{} = St, NewSecurity) ->
347+
{ok, increment_update_seq(set_header_term(St, ?SECURITY_PTR, NewSecurity))}.
360348

361-
set_props(#st{header = Header} = St, Props) ->
362-
Options = [{compression, St#st.compression}],
363-
{ok, Ptr, _} = couch_file:append_term(St#st.fd, Props, Options),
364-
NewSt = St#st{
365-
header = couch_bt_engine_header:set(Header, [
366-
{props_ptr, Ptr}
367-
]),
368-
needs_commit = true
369-
},
370-
{ok, increment_update_seq(NewSt)}.
349+
set_props(#st{} = St, Props) ->
350+
{ok, increment_update_seq(set_header_term(St, ?PROPS_PTR, Props))}.
371351

372352
open_docs(#st{} = St, DocIds) ->
373353
Results = couch_btree:lookup(St#st.id_tree, DocIds),
@@ -487,7 +467,7 @@ write_doc_infos(#st{} = St, Pairs, LocalDocs) ->
487467
),
488468

489469
NewHeader = couch_bt_engine_header:set(St#st.header, [
490-
{update_seq, NewUpdateSeq}
470+
{?UPDATE_SEQ, NewUpdateSeq}
491471
]),
492472

493473
{ok, St#st{
@@ -509,7 +489,7 @@ purge_docs(#st{} = St, Pairs, PurgeInfos) ->
509489
RemDocIds = [Old#full_doc_info.id || {Old, not_found} <- Pairs],
510490
RemSeqs = [Old#full_doc_info.update_seq || {Old, _} <- Pairs],
511491
DocsToAdd = [New || {_, New} <- Pairs, New /= not_found],
512-
CurrSeq = couch_bt_engine_header:get(St#st.header, update_seq),
492+
CurrSeq = couch_bt_engine_header:get(St#st.header, ?UPDATE_SEQ),
513493
Seqs = [FDI#full_doc_info.update_seq || FDI <- DocsToAdd],
514494
NewSeq = lists:max([CurrSeq | Seqs]),
515495

@@ -522,7 +502,7 @@ purge_docs(#st{} = St, Pairs, PurgeInfos) ->
522502
false -> NewSeq
523503
end,
524504
Header = couch_bt_engine_header:set(St#st.header, [
525-
{update_seq, UpdateSeq}
505+
{?UPDATE_SEQ, UpdateSeq}
526506
]),
527507

528508
{ok, IdTree2} = couch_btree:add_remove(IdTree, DocsToAdd, RemDocIds),
@@ -802,30 +782,16 @@ purge_tree_reduce(rereduce, Reds) ->
802782
set_update_seq(#st{header = Header} = St, UpdateSeq) ->
803783
{ok, St#st{
804784
header = couch_bt_engine_header:set(Header, [
805-
{update_seq, UpdateSeq}
785+
{?UPDATE_SEQ, UpdateSeq}
806786
]),
807787
needs_commit = true
808788
}}.
809789

810-
copy_security(#st{header = Header} = St, SecProps) ->
811-
Options = [{compression, St#st.compression}],
812-
{ok, Ptr, _} = couch_file:append_term(St#st.fd, SecProps, Options),
813-
{ok, St#st{
814-
header = couch_bt_engine_header:set(Header, [
815-
{security_ptr, Ptr}
816-
]),
817-
needs_commit = true
818-
}}.
790+
copy_security(#st{} = St, SecProps) ->
791+
{ok, set_header_term(St, ?SECURITY_PTR, SecProps)}.
819792

820-
copy_props(#st{header = Header} = St, Props) ->
821-
Options = [{compression, St#st.compression}],
822-
{ok, Ptr, _} = couch_file:append_term(St#st.fd, Props, Options),
823-
{ok, St#st{
824-
header = couch_bt_engine_header:set(Header, [
825-
{props_ptr, Ptr}
826-
]),
827-
needs_commit = true
828-
}}.
793+
copy_props(#st{} = St, Props) ->
794+
{ok, set_header_term(St, ?PROPS_PTR, Props)}.
829795

830796
open_db_file(FilePath, Options) ->
831797
case couch_file:open(FilePath, Options) of
@@ -931,22 +897,20 @@ update_header(St, Header) ->
931897
]).
932898

933899
increment_update_seq(#st{header = Header} = St) ->
934-
UpdateSeq = couch_bt_engine_header:get(Header, update_seq),
900+
UpdateSeq = couch_bt_engine_header:get(Header, ?UPDATE_SEQ),
935901
St#st{
936902
header = couch_bt_engine_header:set(Header, [
937-
{update_seq, UpdateSeq + 1}
903+
{?UPDATE_SEQ, UpdateSeq + 1}
938904
])
939905
}.
940906

941907
set_default_security_object(Fd, Header, Compression, Options) ->
942-
case couch_bt_engine_header:get(Header, security_ptr) of
908+
case couch_bt_engine_header:get(Header, ?SECURITY_PTR) of
943909
Pointer when is_integer(Pointer) ->
944910
Header;
945911
_ ->
946912
Default = couch_util:get_value(default_security_object, Options),
947-
AppendOpts = [{compression, Compression}],
948-
{ok, Ptr, _} = couch_file:append_term(Fd, Default, AppendOpts),
949-
couch_bt_engine_header:set(Header, security_ptr, Ptr)
913+
set_header_term(Fd, Header, ?SECURITY_PTR, Default, Compression)
950914
end.
951915

952916
% This function is here, and not in couch_bt_engine_header
@@ -1013,9 +977,7 @@ init_set_props(Fd, Header, Options) ->
1013977
Header;
1014978
InitialProps ->
1015979
Compression = couch_compress:get_compression_method(),
1016-
AppendOpts = [{compression, Compression}],
1017-
{ok, Ptr, _} = couch_file:append_term(Fd, InitialProps, AppendOpts),
1018-
couch_bt_engine_header:set(Header, props_ptr, Ptr)
980+
set_header_term(Fd, Header, ?PROPS_PTR, InitialProps, Compression)
1019981
end.
1020982

1021983
delete_compaction_files(FilePath) ->
@@ -1188,9 +1150,9 @@ finish_compaction_int(#st{} = OldSt, #st{} = NewSt1) ->
11881150

11891151
{ok, NewSt2} = commit_data(NewSt1#st{
11901152
header = couch_bt_engine_header:set(Header, [
1191-
{compacted_seq, get_update_seq(OldSt)},
1192-
{revs_limit, get_revs_limit(OldSt)},
1193-
{purge_infos_limit, get_purge_infos_limit(OldSt)}
1153+
{?COMPACTED_SEQ, get_update_seq(OldSt)},
1154+
{?REVS_LIMIT, get_revs_limit(OldSt)},
1155+
{?PURGE_INFOS_LIMIT, get_purge_infos_limit(OldSt)}
11941156
]),
11951157
local_tree = NewLocal2
11961158
}),
@@ -1227,3 +1189,24 @@ is_file(Path) ->
12271189
{ok, #file_info{type = directory}} -> true;
12281190
_ -> false
12291191
end.
1192+
1193+
get_header_term(#st{header = Header} = St, Key, Default) when is_atom(Key) ->
1194+
case couch_bt_engine_header:get(Header, Key) of
1195+
undefined ->
1196+
Default;
1197+
Pointer when is_integer(Pointer) ->
1198+
{ok, Term} = couch_file:pread_term(St#st.fd, Pointer),
1199+
Term
1200+
end.
1201+
1202+
set_header_term(#st{} = St, Key, Term) when is_atom(Key) ->
1203+
#st{fd = Fd, header = Header, compression = Compression} = St,
1204+
St#st{
1205+
header = set_header_term(Fd, Header, Key, Term, Compression),
1206+
needs_commit = true
1207+
}.
1208+
1209+
set_header_term(Fd, Header, Key, Term, Compression) when is_atom(Key) ->
1210+
TermOpts = [{compression, Compression}],
1211+
{ok, Ptr, _} = couch_file:append_term(Fd, Term, TermOpts),
1212+
couch_bt_engine_header:set(Header, Key, Ptr).

0 commit comments

Comments
 (0)