File 0524-Fix-restore-disk_only-with-index.patch of Package erlang

From b53e554d8683e0b7ca8925d8a077b2b6c8ebea4e Mon Sep 17 00:00:00 2001
From: Dan Gudmundsson <dgud@erlang.org>
Date: Tue, 31 Oct 2023 16:08:18 +0100
Subject: [PATCH] Fix restore disk_only with index

Remove the disk_delete_indecies in the restore op,
it could fail if called during startup and it will be done in
create_table op later anyway.

Fixes #7766
---
 lib/mnesia/src/mnesia_dumper.erl       |  1 -
 lib/mnesia/test/mnesia_evil_backup.erl | 53 +++++++++++++++++++++++++-
 2 files changed, 51 insertions(+), 3 deletions(-)

diff --git a/lib/mnesia/src/mnesia_dumper.erl b/lib/mnesia/src/mnesia_dumper.erl
index aea1f93083..01759d8381 100644
--- a/lib/mnesia/src/mnesia_dumper.erl
+++ b/lib/mnesia/src/mnesia_dumper.erl
@@ -711,7 +711,6 @@ insert_op(Tid, _, {op, restore_recreate, TabDef}, InPlace, InitBy) ->
 		end,
     %% Delete all possibly existing files and tables
     disc_delete_table(Tab, Storage),
-    disc_delete_indecies(Tab, Cs, Storage),
     case InitBy of
 	startup ->
 	    ignore;
diff --git a/lib/mnesia/test/mnesia_evil_backup.erl b/lib/mnesia/test/mnesia_evil_backup.erl
index ec0d3ca3e0..5d858656e2 100644
--- a/lib/mnesia/test/mnesia_evil_backup.erl
+++ b/lib/mnesia/test/mnesia_evil_backup.erl
@@ -41,7 +41,8 @@
          uninstall_fallback/1, local_fallback/1,
          sops_with_checkpoint/1,
          restore_errors/1, restore_clear/1, restore_keep/1,
-         restore_recreate/1, restore_clear_ram/1
+         restore_recreate/1, restore_clear_ram/1,
+         restore_recreate_empty/1
         ]).
 
 -export([check_tab/2]).
@@ -65,7 +66,7 @@ all() ->
 groups() -> 
     [{restore_tables, [],
       [restore_errors, restore_clear, restore_keep,
-       restore_recreate, restore_clear_ram]}].
+       restore_recreate, restore_clear_ram, restore_recreate_empty]}].
 
 init_per_group(_GroupName, Config) ->
     Config.
@@ -405,6 +406,54 @@ restore_clear_ram_loop(N, Nodes = [N1,N2,N3], Bup) when N > 0 ->
 restore_clear_ram_loop(_,_,_) ->
     ok.
 
+restore_recreate_empty(doc) ->
+    ["Test recreation from empty schema"];
+restore_recreate_empty(suite) -> [];
+restore_recreate_empty(Config) ->
+    Nodes = ?acquire_nodes(1, Config),
+
+    Tab1 = ram_snmp,
+    Def1 = [{snmp, [{key, integer}]}, {ram_copies, Nodes}],
+    Tab2 = disc_index,
+    Def2 = [{type, bag}, {index, [val]}, {disc_copies, Nodes}],
+    Tab3 = dionly,
+    Def3 = [{index, [val]}, {disc_only_copies, Nodes}],
+    ?match({atomic, ok}, mnesia:create_table(Tab1, Def1)),
+    ?match({atomic, ok}, mnesia:create_table(Tab2, Def2)),
+    ?match({atomic, ok}, mnesia:create_table(Tab3, Def3)),
+
+    Res1 = [{Tab1, N, N+42} || N <- lists:seq(1, 10)],
+    Res2 = [{Tab2, N, N+43} || N <- lists:seq(1, 10)],
+    Res3 = [{Tab3, N, N+44} || N <- lists:seq(1, 10)],
+
+    [mnesia:dirty_write(W) || TabW <- [Res1, Res2, Res3], W <- TabW],
+
+    File1 = "recreate.bup",
+    ?match(ok, mnesia:backup(File1)),
+
+    mnesia:dirty_write({Tab1, 12, 12+42}),
+    mnesia:dirty_write({Tab2, 12, 12+43}),
+    mnesia:dirty_write({Tab3, 12, 12+44}),
+
+    stopped = mnesia:stop(),
+    ok = mnesia:delete_schema(Nodes),
+    ok = mnesia:start(),
+
+    ?match({atomic, _Tabs}, mnesia:restore(File1, [{default_op, recreate_tables}])),
+
+    check_tab(Res2, ?LINE),
+    check_tab(Res3, ?LINE),
+
+    ?match([], mnesia:dirty_read({Tab1, 12})),
+    ?match([], mnesia:dirty_read({Tab2, 12})),
+    ?match([], mnesia:dirty_read({Tab3, 12})),
+
+    [?match([{Tab2, N, _}], mnesia:dirty_index_read(Tab2, N+43, val)) || N <- lists:seq(1,10)],
+    [?match([{Tab3, N, _}], mnesia:dirty_index_read(Tab3, N+44, val)) || N <- lists:seq(1,10)],
+
+    ok.
+
+
 traverse_backup(doc) -> 
     ["Testing the traverse_backup interface, the resulting file is not tested though",
      "See install_fallback for result using the output file from traverse_backup",
-- 
2.35.3

openSUSE Build Service is sponsored by