File 2792-logger-Cleanup-close-of-delayed-write-fd.patch of Package erlang
From bc809418ad49de4f3dc62b2988063486f292768e Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Tue, 20 Aug 2019 09:34:15 +0200
Subject: [PATCH 2/7] logger: Cleanup close of delayed write fd
---
lib/kernel/src/logger_std_h.erl | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/lib/kernel/src/logger_std_h.erl b/lib/kernel/src/logger_std_h.erl
index 8477a0fc93..fdfa61b907 100644
--- a/lib/kernel/src/logger_std_h.erl
+++ b/lib/kernel/src/logger_std_h.erl
@@ -335,13 +335,22 @@ open_log_file(HandlerName,#{type:=file,
end.
close_log_file(#{fd:=Fd}) ->
- _ = file:datasync(Fd),
+ _ = file:datasync(Fd), %% file:datasync may return error as it will flush the delayed_write buffer
_ = file:close(Fd),
ok;
close_log_file(_) ->
ok.
-
+%% A special close that closes the FD properly when the delayed write close failed
+delayed_write_close(#{fd:=Fd}) ->
+ case file:close(Fd) of
+ %% We got an error while closing, could be a delayed write failing
+ %% So we close again in order to make sure the file is closed.
+ {error, _} ->
+ file:close(Fd);
+ Res ->
+ Res
+ end.
%%%-----------------------------------------------------------------
%%% File control process
@@ -549,10 +558,9 @@ maybe_rotate_file(AddSize,#{rotation:=#{size:=RotSize,
maybe_rotate_file(_Bin,State) ->
State.
-rotate_file(#{fd:=Fd0,file_name:=FileName,modes:=Modes,rotation:=Rotation}=State) ->
+rotate_file(#{file_name:=FileName,modes:=Modes,rotation:=Rotation}=State) ->
State1 = sync_dev(State),
- _ = file:close(Fd0),
- _ = file:close(Fd0),
+ _ = delayed_write_close(State),
rotate_files(FileName,maps:get(count,Rotation),maps:get(compress,Rotation)),
{ok, Fd} = ensure_open(FileName,Modes),
{ok,#file_info{inode=INode}} = file:read_file_info(FileName,[raw]),
--
2.16.4