File 1326-mnesia-Delay-old-backup-deletion.patch of Package erlang
From 0253ba63ec18bd3ce7508d7659179df228983e2b Mon Sep 17 00:00:00 2001
From: Dan Gudmundsson <dgud@erlang.org>
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 719e010c17..5e17a27f99 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 45b11f2f3f..7901b9149a 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
--
2.35.3