You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ii...@apache.org on 2025/06/23 14:06:46 UTC
(couchdb) 01/01: Introduce couch_file:commit_header/2
This is an automated email from the ASF dual-hosted git repository.
iilyak pushed a commit to branch introduce-commit_header
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit e70a995db2d5dca277c04d72152503bfa51b19c1
Author: ILYA Khlopotov <ii...@apache.org>
AuthorDate: Mon Jun 23 07:02:27 2025 -0700
Introduce couch_file:commit_header/2
This PR is an optimization to reduce number of messages to couch_file proccess,
in casses when we need to call sync. The couch_file:commit_header/2 is more
efficient equivalent of:
```
couch_file:sync(Fd),
ok = couch_file:write_header(Fd, NewHeader),
couch_file:sync(Fd),
```
---
src/couch/src/couch_bt_engine.erl | 4 +---
src/couch/src/couch_bt_engine_compactor.erl | 3 +--
src/couch/src/couch_file.erl | 17 +++++++++++++++--
3 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/src/couch/src/couch_bt_engine.erl b/src/couch/src/couch_bt_engine.erl
index ad84e0db8..422b2c775 100644
--- a/src/couch/src/couch_bt_engine.erl
+++ b/src/couch/src/couch_bt_engine.erl
@@ -562,9 +562,7 @@ commit_data(St) ->
case NewHeader /= OldHeader orelse NeedsCommit of
true ->
- couch_file:sync(Fd),
- ok = couch_file:write_header(Fd, NewHeader),
- couch_file:sync(Fd),
+ ok = couch_file:commit_header(Fd, NewHeader),
couch_stats:increment_counter([couchdb, commits]),
{ok, St#st{
header = NewHeader,
diff --git a/src/couch/src/couch_bt_engine_compactor.erl b/src/couch/src/couch_bt_engine_compactor.erl
index 8ed55b5c3..f879725e9 100644
--- a/src/couch/src/couch_bt_engine_compactor.erl
+++ b/src/couch/src/couch_bt_engine_compactor.erl
@@ -660,8 +660,7 @@ commit_compaction_data(#st{header = OldHeader} = St0, Fd) ->
db_header = Header,
meta_st = MetaState
},
- ok = couch_file:sync(Fd),
- ok = couch_file:write_header(Fd, CompHeader),
+ ok = couch_file:commit_header(Fd, CompHeader),
St2 = St1#st{
header = Header
},
diff --git a/src/couch/src/couch_file.erl b/src/couch/src/couch_file.erl
index 24c910302..714ac9a7e 100644
--- a/src/couch/src/couch_file.erl
+++ b/src/couch/src/couch_file.erl
@@ -47,7 +47,7 @@
-export([append_term/2, append_term/3]).
-export([pread_terms/2]).
-export([append_terms/2, append_terms/3]).
--export([write_header/2, read_header/1]).
+-export([write_header/2, read_header/1, commit_header/2]).
-export([delete/2, delete/3, nuke_dir/2, init_delete_dir/1]).
% gen_server callbacks
@@ -439,6 +439,14 @@ write_header(Fd, Data) ->
FinalBin = <<Checksum/binary, Bin/binary>>,
ioq:call(Fd, {write_header, FinalBin}, erlang:get(io_priority)).
+% Same as write_header/2, but ensure durable write.
+commit_header(Fd, Data) ->
+ Bin = ?term_to_bin(Data),
+ Checksum = generate_checksum(Bin),
+ % now we assemble the final header binary and write to disk
+ FinalBin = <<Checksum/binary, Bin/binary>>,
+ ioq:call(Fd, {commit_header, FinalBin}, erlang:get(io_priority)).
+
init_status_error(ReturnPid, Ref, Error) ->
ReturnPid ! {Ref, self(), Error},
ignore.
@@ -596,7 +604,12 @@ handle_call({write_header, Bin}, _From, #file{fd = Fd, eof = Pos} = File) ->
{reply, Error, reset_eof(File)}
end;
handle_call(find_header, _From, #file{fd = Fd, eof = Pos} = File) ->
- {reply, find_header(Fd, Pos div ?SIZE_BLOCK), File}.
+ {reply, find_header(Fd, Pos div ?SIZE_BLOCK), File};
+handle_call({write_header, Bin}, From, #file{fd = Fd} = File) ->
+ sync(Fd),
+ Result = handle_call({write_header, Bin}, From, File),
+ sync(Fd),
+ Result.
handle_cast(Msg, #file{} = File) ->
{stop, {invalid_cast, Msg}, File}.