From 0253ba63ec18bd3ce7508d7659179df228983e2b Mon Sep 17 00:00:00 2001 From: Dan Gudmundsson Date: Wed, 9 Aug 2023 11:50:28 +0200 Subject: [PATCH] mnesia: Delay old backup deletion So that if the backup fails, the old backup still exists. --- lib/mnesia/src/mnesia_backup.erl | 2 +- lib/mnesia/test/mnesia_evil_backup.erl | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/mnesia/src/mnesia_backup.erl b/lib/mnesia/src/mnesia_backup.erl index 719e010c1791..5e17a27f9987 100644 --- a/lib/mnesia/src/mnesia_backup.erl +++ b/lib/mnesia/src/mnesia_backup.erl @@ -79,7 +79,6 @@ open_write(OpaqueData) -> File = OpaqueData, Tmp = lists:concat([File,".BUPTMP"]), file:delete(Tmp), - file:delete(File), case disk_log:open([{name, make_ref()}, {file, Tmp}, {repair, false}, @@ -112,6 +111,7 @@ commit_write(OpaqueData) -> ok -> case disk_log:close(B#backup.file_desc) of ok -> + file:delete(B#backup.file), case file:rename(B#backup.tmp_file, B#backup.file) of ok -> {ok, B#backup.file}; diff --git a/lib/mnesia/test/mnesia_evil_backup.erl b/lib/mnesia/test/mnesia_evil_backup.erl index 45b11f2f3f27..7901b9149ac6 100644 --- a/lib/mnesia/test/mnesia_evil_backup.erl +++ b/lib/mnesia/test/mnesia_evil_backup.erl @@ -141,7 +141,7 @@ global_backup_checkpoint(Config) when is_list(Config) -> ?match(ok, mnesia:backup_checkpoint(cp_name, File)), ?match({error, _}, mnesia:backup_checkpoint(cp_name_nonexist, File)), ?match(ok, mnesia:backup_checkpoint(cp_name, File2, mnesia_backup)), - ?match({error, _}, file:delete(File)), + ?match(ok, file:delete(File)), ?match(ok, file:delete(File2)), ?verify_mnesia(Nodes, []). @@ -761,7 +761,10 @@ sops_with_checkpoint(Config) when is_list(Config) -> ?match(ok, mnesia:dirty_write({Tab,8,-8})), ?match({atomic,ok}, mnesia:delete_table(Tab)), + ?match(true, filelib:is_file(File2)), ?match({error,_}, mnesia:backup_checkpoint(cp2, File2)), + ?match(true, filelib:is_file(File2)), + ?match({'EXIT',_}, mnesia:dirty_write({Tab,9,-9})), ?match({atomic,_}, mnesia:restore(File1, [{default_op, recreate_tables}])), @@ -772,6 +775,7 @@ sops_with_checkpoint(Config) when is_list(Config) -> end end, [Test(N) || N <- mnesia:dirty_all_keys(Tab)], + ok = file:delete(File2), ?match({aborted,enoent}, mnesia:restore(File2, [{default_op, recreate_tables}])), %% Mnesia crashes when deleting a table during backup