File 1102-Add-test-to-check-persistence-of-disc_copies-table-w.patch of Package erlang

From e47ef7c1ec13fbbe26ba3903e41fb3558affc82c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20W=C4=85sowski?= <michal@erlang.org>
Date: Mon, 14 Oct 2024 08:25:52 +0200
Subject: [PATCH 2/2] Add test to check persistence of disc_copies table when
 converting from ext

---
 lib/mnesia/test/Makefile                      |  3 +-
 lib/mnesia/test/mnesia_SUITE.erl              |  5 +-
 .../test/mnesia_external_backend_test.erl     | 79 +++++++++++++++++++
 lib/mnesia/test/mt.erl                        |  1 +
 4 files changed, 85 insertions(+), 3 deletions(-)
 create mode 100644 lib/mnesia/test/mnesia_external_backend_test.erl

diff --git a/lib/mnesia/test/Makefile b/lib/mnesia/test/Makefile
index c3fbad88ca..9e0f19765a 100644
--- a/lib/mnesia/test/Makefile
+++ b/lib/mnesia/test/Makefile
@@ -54,7 +54,8 @@ MODULES= \
 	mnesia_cost \
 	mnesia_dbn_meters \
 	ext_test \
-	mnesia_index_plugin_test
+	mnesia_index_plugin_test \
+	mnesia_external_backend_test
 
 DocExamplesDir := ../doc/src/
 
diff --git a/lib/mnesia/test/mnesia_SUITE.erl b/lib/mnesia/test/mnesia_SUITE.erl
index 123d16023f..9791088227 100644
--- a/lib/mnesia/test/mnesia_SUITE.erl
+++ b/lib/mnesia/test/mnesia_SUITE.erl
@@ -58,7 +58,7 @@ suite() -> [{ct_hooks,[{ts_install_cth,[{nodenames,2}]}]}].
 
 all() -> 
     [app, appup, {group, light}, {group, medium}, {group, heavy},
-     clean_up_suite].
+     clean_up_suite, {group, external}].
 
 groups() -> 
     %% The 'light' test suite runs a selected set of test suites and is
@@ -123,7 +123,8 @@ groups() ->
        {mnesia_dirty_access_test,
 	dirty_index_update_set_disc_only},
        {mnesia_evil_coverage_test,
-	create_live_table_index_disc_only}]}].
+	create_live_table_index_disc_only}]},
+     {external, [], [{mnesia_external_backend_test, all}]}].
 
 init_per_group(_GroupName, Config) ->
 	Config.
diff --git a/lib/mnesia/test/mnesia_external_backend_test.erl b/lib/mnesia/test/mnesia_external_backend_test.erl
new file mode 100644
index 0000000000..1391be7c88
--- /dev/null
+++ b/lib/mnesia/test/mnesia_external_backend_test.erl
@@ -0,0 +1,79 @@
+-module(mnesia_external_backend_test).
+
+-export([init_per_testcase/2, end_per_testcase/2,
+         init_per_group/2, end_per_group/2,
+         suite/0, all/0, groups/0]).
+
+-export([conversion_from_external_to_disc_copies_results_in_data_loss_after_node_restart/1]).
+
+-include("mnesia_test_lib.hrl").
+
+-record(some_rec, {some_id :: atom(), some_int :: number(), some_string :: string()}).
+
+-define(acquire(N, Config),
+        mnesia_test_lib:prepare_test_case([{init_test_case, [mnesia]},
+                                           delete_schema],
+                                          N, Config, ?FILE, ?LINE)).
+
+all() -> 
+    [conversion_from_external_to_disc_copies_results_in_data_loss_after_node_restart].
+
+groups() ->
+    [].
+
+init_per_testcase(Func, Conf) ->
+    mnesia_test_lib:init_per_testcase(Func, Conf).
+
+end_per_testcase(Func, Conf) ->
+    mnesia_test_lib:end_per_testcase(Func, Conf).
+
+init_per_group(_GroupName, Config) ->
+    Config.
+
+end_per_group(_GroupName, Config) ->
+    Config.
+
+suite() -> [{ct_hooks,[{ts_install_cth,[{nodenames,1}]}]}].
+
+conversion_from_external_to_disc_copies_results_in_data_loss_after_node_restart(Config) when is_list(Config) ->
+    Node = node(),
+    Data = [
+        #some_rec{some_id = a, some_int = 1, some_string = "something" },
+        #some_rec{some_id = b, some_int = 2, some_string = "anything"  },
+        #some_rec{some_id = c, some_int = 3, some_string = "everything"},
+        #some_rec{some_id = d, some_int = 4, some_string = "nothing"   }
+    ],
+
+    [Node] = ?acquire(1, Config),
+    ok = mnesia:create_schema([Node]),
+    ok = mnesia:start(),
+    {atomic, ok} = mnesia:add_backend_type(ext_ets, ext_test),
+    {atomic, ok} = mnesia:add_backend_type(ext_dets, ext_test),
+    {atomic, ok} = mnesia:create_table(table, [
+        {type, ordered_set},
+        {record_name, some_rec},
+        {attributes, record_info(fields, some_rec)},
+        {disc_copies, [Node]}
+    ]),
+
+    ok = mnesia:activity(transaction, fun() ->
+        lists:foreach(fun(Elem) -> mnesia:write(table, Elem, write) end, Data)
+    end),
+
+    {atomic, ok} = mnesia:change_table_copy_type(table, Node, ext_ets),
+    Data = mnesia:activity(transaction, fun() ->
+        mnesia:match_object(table, #some_rec{_ = '_'}, read) end
+    ),
+
+    {atomic, ok} = mnesia:change_table_copy_type(table, Node, disc_copies),
+    Data = mnesia:activity(transaction, fun() ->
+        mnesia:match_object(table, #some_rec{_ = '_'}, read) end
+    ),
+
+    stopped = mnesia:stop(),
+    ok = mnesia:start(),
+    ok = mnesia:wait_for_tables([schema, table], 10000),
+
+    Data = mnesia:activity(transaction, fun() ->
+        mnesia:match_object(table, #some_rec{_ = '_'}, read) end
+    ).
diff --git a/lib/mnesia/test/mt.erl b/lib/mnesia/test/mt.erl
index b5eea30690..06b76f0e64 100644
--- a/lib/mnesia/test/mt.erl
+++ b/lib/mnesia/test/mt.erl
@@ -68,6 +68,7 @@ alias(registry) -> mnesia_registry_test;
 alias(suite) -> mnesia_SUITE;
 alias(trans) -> mnesia_trans_access_test;
 alias(ixp) -> mnesia_index_plugin_test;
+alias(external) -> mnesia_external_backend_test;
 alias(Other) -> Other.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-- 
2.43.0

openSUSE Build Service is sponsored by