summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2022-07-11 16:56:07 +0100
committerGitHub <noreply@github.com>2022-07-11 16:56:07 +0100
commit22f0b44efdb1f4df588ee553cca303a1dffbabee (patch)
treec79930da72d08dde3fe1deae1f9b1445ba5ea7bb
parent4fab0509d3af2a396b7924a4700bd32d256a9617 (diff)
parent5eef3fff5bcdb6fe5295e3d15aa3d1999478cae3 (diff)
downloadcouchdb-22f0b44efdb1f4df588ee553cca303a1dffbabee.tar.gz
Merge pull request #4093 from noahshaw11/fix-error-handling-smoosh
Improve error handling in smoosh_utils:write_to_file/3
-rw-r--r--src/smoosh/src/smoosh_utils.erl53
1 files changed, 38 insertions, 15 deletions
diff --git a/src/smoosh/src/smoosh_utils.erl b/src/smoosh/src/smoosh_utils.erl
index 354b3df57..c48e73149 100644
--- a/src/smoosh/src/smoosh_utils.erl
+++ b/src/smoosh/src/smoosh_utils.erl
@@ -61,30 +61,53 @@ in_allowed_window(From, To) ->
file_delete(Path) ->
case file:delete(Path) of
+ % When deleting a state file, we do not care if it does not exist.
Ret when Ret =:= ok; Ret =:= {error, enoent} ->
ok;
- Error ->
- Error
+ {error, Reason} ->
+ {error, Reason}
end.
-throw_on_error(_Args, ok) ->
- ok;
-throw_on_error(Args, {error, Reason}) ->
- throw({error, {Reason, Args}}).
-
write_to_file(Content, FileName, VSN) ->
Level = log_level("compaction_log_level", "debug"),
couch_log:Level("~p Writing state ~s", [?MODULE, FileName]),
OnDisk = <<VSN, (erlang:term_to_binary(Content, [compressed, {minor_version, 1}]))/binary>>,
TmpFileName = FileName ++ ".tmp",
- try
- throw_on_error(TmpFileName, file_delete(TmpFileName)),
- throw_on_error(TmpFileName, file:write_file(TmpFileName, OnDisk, [sync])),
- throw_on_error(FileName, file_delete(FileName)),
- throw_on_error([TmpFileName, FileName], file:rename(TmpFileName, FileName))
- catch
- throw:Error ->
- Error
+ case file_delete(TmpFileName) of
+ ok ->
+ case file:write_file(TmpFileName, OnDisk, [sync]) of
+ ok ->
+ case file_delete(FileName) of
+ ok ->
+ case file:rename(TmpFileName, FileName) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ couch_log:error(
+ "~p (~p) Error renaming temporary state file ~s to ~s", [
+ ?MODULE, Reason, TmpFileName, FileName
+ ]
+ ),
+ ok
+ end;
+ {error, Reason} ->
+ couch_log:error("~p (~p) Error deleting state file ~s", [
+ ?MODULE, Reason, FileName
+ ]),
+ ok
+ end;
+ {error, Reason} ->
+ couch_log:error("~p (~p) Error writing state to temporary file ~s", [
+ ?MODULE, Reason, TmpFileName
+ ]),
+ ok
+ end;
+ {error, Reason} ->
+ % Failing to persist the queue should not crash smoosh. Return ok.
+ couch_log:error("~p (~p) Error deleting temporary state file ~s", [
+ ?MODULE, Reason, TmpFileName
+ ]),
+ ok
end.
parse_time(undefined, Default) ->