diff --git a/lib/mnesia/src/mnesia_schema.erl b/lib/mnesia/src/mnesia_schema.erl index 75647ffe87fd..92d4fe65570e 100644 --- a/lib/mnesia/src/mnesia_schema.erl +++ b/lib/mnesia/src/mnesia_schema.erl @@ -3673,7 +3673,13 @@ change_storage_type(N, disc_copies, Cs) -> Cs#cstruct{disc_copies = mnesia_lib:uniq(Nodes)}; change_storage_type(N, disc_only_copies, Cs) -> Nodes = [N | Cs#cstruct.disc_only_copies], - Cs#cstruct{disc_only_copies = mnesia_lib:uniq(Nodes)}. + Cs#cstruct{disc_only_copies = mnesia_lib:uniq(Nodes)}; +change_storage_type(N, {ext, Alias, Mod}, Cs) -> + Key = {Alias, Mod}, + {_, Nodes0} = lists:keyfind(Key, 1, Cs#cstruct.external_copies), + Nodes = mnesia_lib:uniq([N | Nodes0]), + ExternalCopies = lists:keyreplace(Key, 1, Cs#cstruct.external_copies, {Key, Nodes}), + Cs#cstruct{external_copies = ExternalCopies}. %% BUGBUG: Verify match of frag info; equalit demanded for all but add_node diff --git a/lib/mnesia/test/Makefile b/lib/mnesia/test/Makefile index c3fbad88ca1b..9e0f19765a6f 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_external_backend_test.erl b/lib/mnesia/test/mnesia_external_backend_test.erl new file mode 100644 index 000000000000..891dad52d5e5 --- /dev/null +++ b/lib/mnesia/test/mnesia_external_backend_test.erl @@ -0,0 +1,70 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% + +-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([ + schema_merge_should_work_when_node_is_removed_from_the_cluster_and_later_rejoins/1 +]). + +-include("mnesia_test_lib.hrl"). + +-record(some_rec, {some_id :: atom(), some_int :: number(), some_string :: string()}). + +all() -> [ + schema_merge_should_work_when_node_is_removed_from_the_cluster_and_later_rejoins +]. + +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,3}]}]}]. + +schema_merge_should_work_when_node_is_removed_from_the_cluster_and_later_rejoins(Config) when is_list(Config) -> + [N1, N2] = ?acquire_nodes(2, Config), + + ?match({atomic,ok}, mnesia:create_table(table, [ + {type, set}, + {record_name, some_rec}, + {attributes, record_info(fields, some_rec)}, + {ext_ets, [N1, N2]} + ])), + + ?match([], mnesia_test_lib:kill_mnesia([N2])), + + ?match({atomic, ok}, mnesia:del_table_copy(schema, N2)), + + ?match([], mnesia_test_lib:start_mnesia([N2])). diff --git a/lib/mnesia/test/mt.erl b/lib/mnesia/test/mt.erl index b5eea3069083..06b76f0e642d 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. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%