File 1162-Rename-external-aliases-and-make-use-of-ext_test_ser.patch of Package erlang
From 64e22a4cc4030840639f6e7c47f50d5fdf2ee536 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20W=C4=85sowski?= <michal@erlang.org>
Date: Mon, 16 Dec 2024 18:24:01 +0100
Subject: [PATCH 2/3] Rename external aliases and make use of ext_test_server
---
lib/mnesia/test/ext_test.erl | 267 +++++++++---------
lib/mnesia/test/mnesia_config_test.erl | 4 +-
lib/mnesia/test/mnesia_dirty_access_test.erl | 24 +-
lib/mnesia/test/mnesia_evil_coverage_test.erl | 24 +-
lib/mnesia/test/mnesia_test_lib.erl | 30 +-
lib/mnesia/test/mnesia_test_lib.hrl | 3 +-
6 files changed, 194 insertions(+), 158 deletions(-)
diff --git a/lib/mnesia/test/ext_test.erl b/lib/mnesia/test/ext_test.erl
index f7f6ec5990..7d57955511 100644
--- a/lib/mnesia/test/ext_test.erl
+++ b/lib/mnesia/test/ext_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
+%% 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.
@@ -20,6 +20,9 @@
-module(ext_test).
+-include("mnesia_test_lib.hrl").
+-include("ext_test_server.hrl").
+
%% Initializations
-export([init_backend/0, add_aliases/1, remove_aliases/1,
check_definition/4, semantics/2]).
@@ -47,204 +50,212 @@
select/1, select/3, select/4, repair_continuation/2
]).
--ifdef(DEBUG).
--define(DBG(DATA), io:format("~p:~p: ~p~n",[?MODULE, ?LINE, DATA])).
--define(DBG(FORMAT, ARGS), io:format("~p:~p: " ++ FORMAT,[?MODULE, ?LINE] ++ ARGS)).
--else.
--define(DBG(DATA), ok).
--define(DBG(FORMAT, ARGS), ok).
--endif.
-
-%% types() ->
-%% [{fs_copies, ?MODULE},
-%% {raw_fs_copies, ?MODULE}].
-
-semantics(ext_ets, storage) -> ram_copies;
-semantics(ext_ets, types ) -> [set, ordered_set, bag];
-semantics(ext_ets, index_types) -> [ordered];
+semantics(ext_ram_copies, storage) -> ram_copies;
+semantics(ext_ram_copies, types ) -> [set, ordered_set, bag];
+semantics(ext_ram_copies, index_types) -> [ordered];
+semantics(ext_disc_only_copies, storage) -> disc_only_copies;
+semantics(ext_disc_only_copies, types ) -> [set, bag];
+semantics(ext_disc_only_copies, index_types) -> [bag];
semantics(_Alias, _) ->
undefined.
-%% valid_op(_, _) ->
-%% true.
-
init_backend() ->
- ?DBG(init_backend),
+ ?DBG(),
%% cheat and stuff a marker in mnesia_gvar
K = backend_init_marker(),
case try ets:lookup_element(mnesia_gvar, K, 2) catch _:_ -> error end of
error ->
- mnesia_lib:set(K, true);
+ mnesia_lib:set(K, true),
+ ok;
Other ->
- error({backend_already_initialized, {?MODULE, Other}})
- end,
- ok.
+ {error, {backend_already_initialized, {?MODULE, Other}}}
+ end.
backend_init_marker() ->
{test, ?MODULE, backend_init}.
+error_if_not_initialized() ->
+ case try ets:lookup_element(mnesia_gvar, backend_init_marker(), 2) catch _:_ -> error end of
+ error ->
+ ?DBG({backend_not_initialized, {?MODULE, error}}),
+ error({backend_not_initialized, {?MODULE, error}});
+ _Other ->
+ ok
+ end.
+
add_aliases(_As) ->
?DBG(_As),
- %ct:log("add_aliases(~p)", [_As]),
+ case init_backend() of
+ ok ->
+ ok;
+ _ ->
+ ignore
+ end,
+ error_if_not_initialized(),
true = mnesia_lib:val(backend_init_marker()),
ok.
-remove_aliases(_) ->
+remove_aliases(_As) ->
+ ?DBG(_As),
+ error_if_not_initialized(),
ok.
%% Table operations
-check_definition(ext_ets, _Tab, _Nodes, _Props) ->
- ?DBG("~p ~p ~p~n", [_Tab, _Nodes, _Props]),
+check_definition(_Alias, _Tab, _Nodes, _Props) ->
+ ?DBG({_Alias, ext_test_server:tab_to_list(_Tab), _Nodes, _Props}),
ok.
-create_table(ext_ets, Tab, Props) when is_atom(Tab) ->
- Tid = ets:new(Tab, [public, proplists:get_value(type, Props, set), {keypos, 2}]),
- ?DBG("~p Create: ~p(~p) ~p~n", [self(), Tab, Tid, Props]),
- mnesia_lib:set({?MODULE, Tab}, Tid),
- ok;
-create_table(_, Tag={Tab, index, {_Where, Type0}}, _Opts) ->
- Type = case Type0 of
- ordered -> ordered_set;
- _ -> Type0
- end,
- Tid = ets:new(Tab, [public, Type]),
- ?DBG("~p(~p) ~p~n", [Tab, Tid, Tag]),
- mnesia_lib:set({?MODULE, Tag}, Tid),
- ok;
-create_table(_, Tag={_Tab, retainer, ChkPName}, _Opts) ->
- Tid = ets:new(ChkPName, [set, public, {keypos, 2}]),
- ?DBG("~p(~p) ~p~n", [_Tab, Tid, Tag]),
- mnesia_lib:set({?MODULE, Tag}, Tid),
- ok.
+create_table(Alias, Tab, Props) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Props}),
+ try error_if_not_initialized() of
+ ok ->
+ call({?FUNCTION_NAME, Alias, Tab, Props})
+ catch error : {backend_not_initialized, _} = Reason ->
+ {aborted, Reason}
+ end.
-delete_table(ext_ets, Tab) ->
- try
- ets:delete(mnesia_lib:val({?MODULE,Tab})),
- mnesia_lib:unset({?MODULE,Tab}),
- ok
- catch _:_ ->
- ?DBG({double_delete, Tab}),
- ok
+delete_table(Alias, Tab) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab)}),
+ try error_if_not_initialized() of
+ ok ->
+ call({?FUNCTION_NAME, Alias, Tab})
+ catch error : {backend_not_initialized, _} = Reason ->
+ ok
end.
-load_table(ext_ets, _Tab, init_index, _Cs) -> ok;
-load_table(ext_ets, _Tab, _LoadReason, _Cs) ->
- ?DBG("Load ~p ~p~n", [_Tab, _LoadReason]),
- ok.
-%% mnesia_monitor:unsafe_create_external(Tab, ext_ets, ?MODULE, Cs).
+load_table(Alias, Tab, LoadReason, Cs) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), LoadReason, Cs}),
+ call({?FUNCTION_NAME, Alias, Tab, LoadReason, Cs}).
-sender_init(Alias, Tab, _RemoteStorage, _Pid) ->
- KeysPerTransfer = 100,
- {standard,
- fun() -> mnesia_lib:db_init_chunk({ext,Alias,?MODULE}, Tab, KeysPerTransfer) end,
- fun(Cont) -> mnesia_lib:db_chunk({ext,Alias,?MODULE}, Cont) end}.
+sender_init(Alias, Tab, RemoteStorage, Pid) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), RemoteStorage, Pid}),
+ call({?FUNCTION_NAME, Alias, Tab, RemoteStorage, Pid, ?MODULE}).
receiver_first_message(Sender, {first, Size}, _Alias, Tab) ->
- ?DBG({first,Size}),
+ ?DBG({Sender, {first, Size}, _Alias, ext_test_server:tab_to_list(Tab)}),
+ error_if_not_initialized(),
{Size, {Tab, Sender}}.
-receive_data(Data, ext_ets, Name, Sender, {Name, Tab, Sender}=State) ->
- ?DBG({Data,State}),
- true = ets:insert(Tab, Data),
- {more, State};
-receive_data(Data, Alias, Tab, Sender, {Name, Sender}) ->
- receive_data(Data, Alias, Tab, Sender, {Name, mnesia_lib:val({?MODULE,Tab}), Sender}).
+receive_data(Data, Alias, Name, Sender, State) ->
+ ?DBG({Data, Alias, ext_test_server:tab_to_list(Name), Sender, State}),
+ call({?FUNCTION_NAME, Data, Alias, Name, Sender, State}).
receive_done(_Alias, _Tab, _Sender, _State) ->
- ?DBG({done,_State}),
+ ?DBG({_Alias, ext_test_server:tab_to_list(_Tab), _Sender, _State}),
+ error_if_not_initialized(),
ok.
-close_table(Alias, Tab) -> sync_close_table(Alias, Tab).
+close_table(Alias, Tab) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab)}),
+ error_if_not_initialized(),
+ sync_close_table(Alias, Tab).
-sync_close_table(ext_ets, _Tab) ->
- ?DBG(_Tab).
+sync_close_table(Alias, Tab) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab)}),
+ call({?FUNCTION_NAME, Alias, Tab}).
-fixtable(ext_ets, Tab, Bool) ->
- ?DBG({Tab,Bool}),
- ets:safe_fixtable(mnesia_lib:val({?MODULE,Tab}), Bool).
+fixtable(Alias, Tab, Bool) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Bool}),
+ call({?FUNCTION_NAME, Alias, Tab, Bool}).
-info(ext_ets, Tab, Type) ->
- ?DBG({Tab,Type}),
- Tid = mnesia_lib:val({?MODULE,Tab}),
- try ets:info(Tid, Type) of
- Val -> Val
- catch _:_ ->
- undefined
- end.
+info(Alias, Tab, Type) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Type}),
+ call({?FUNCTION_NAME, Alias, Tab, Type}).
real_suffixes() ->
- [".dat"].
+ [".dat.ext"].
tmp_suffixes() ->
[].
%% Index
-index_is_consistent(_Alias, _Ix, _Bool) -> ok. % Ignore for now
-is_index_consistent(_Alias, _Ix) -> false. % Always rebuild
+index_is_consistent(Alias, Ix, Bool) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Ix), Bool}),
+ call({?FUNCTION_NAME, Alias, Ix, Bool}).
+
+is_index_consistent(Alias, Ix) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Ix)}),
+ call({?FUNCTION_NAME, Alias, Ix}).
%% Record operations
validate_record(_Alias, _Tab, RecName, Arity, Type, _Obj) ->
+ ?DBG({_Alias, ext_test_server:tab_to_list(_Tab), RecName, Arity, Type, _Obj}),
+ error_if_not_initialized(),
{RecName, Arity, Type}.
validate_key(_Alias, _Tab, RecName, Arity, Type, _Key) ->
+ ?DBG({_Alias, ext_test_server:tab_to_list(_Tab), RecName, Arity, Type, _Key}),
+ error_if_not_initialized(),
{RecName, Arity, Type}.
-insert(ext_ets, Tab, Obj) ->
- ?DBG({Tab,Obj}),
- try
- ets:insert(mnesia_lib:val({?MODULE,Tab}), Obj),
- ok
- catch _:Reason ->
- io:format("CRASH ~p ~p~n",[Reason, mnesia_lib:val({?MODULE,Tab})])
- end.
+insert(Alias, Tab, Obj) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Obj}),
+ call({?FUNCTION_NAME, Alias, Tab, Obj}).
-lookup(ext_ets, Tab, Key) ->
- ets:lookup(mnesia_lib:val({?MODULE,Tab}), Key).
+lookup(Alias, Tab, Obj) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Obj}),
+ call({?FUNCTION_NAME, Alias, Tab, Obj}).
-delete(ext_ets, Tab, Key) ->
- ets:delete(mnesia_lib:val({?MODULE,Tab}), Key).
+delete(Alias, Tab, Key) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Key}),
+ call({?FUNCTION_NAME, Alias, Tab, Key}).
-match_delete(ext_ets, Tab, Pat) ->
- ets:match_delete(mnesia_lib:val({?MODULE,Tab}), Pat).
+match_delete(Alias, Tab, Pat) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Pat}),
+ call({?FUNCTION_NAME, Alias, Tab, Pat}).
-first(ext_ets, Tab) ->
- ets:first(mnesia_lib:val({?MODULE,Tab})).
+first(Alias, Tab) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab)}),
+ call({?FUNCTION_NAME, Alias, Tab}).
-last(Alias, Tab) -> first(Alias, Tab).
+last(Alias, Tab) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab)}),
+ error_if_not_initialized(),
+ first(Alias, Tab).
-next(ext_ets, Tab, Key) ->
- ets:next(mnesia_lib:val({?MODULE,Tab}), Key).
+next(Alias, Tab, Key) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Key}),
+ call({?FUNCTION_NAME, Alias, Tab, Key}).
prev(Alias, Tab, Key) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Key}),
+ error_if_not_initialized(),
next(Alias, Tab, Key).
-slot(ext_ets, Tab, Pos) ->
- ets:slot(mnesia_lib:val({?MODULE,Tab}), Pos).
+slot(Alias, Tab, Pos) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Pos}),
+ call({?FUNCTION_NAME, Alias, Tab, Pos}).
-update_counter(ext_ets, Tab, C, Val) ->
- ets:update_counter(mnesia_lib:val({?MODULE,Tab}), C, Val).
+update_counter(Alias, Tab, C, Val) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), C, Val}),
+ call({?FUNCTION_NAME, Alias, Tab, C, Val}).
-select('$end_of_table' = End) -> End;
-select({ext_ets, C}) -> ets:select(C).
+select(Continuation) ->
+ ?DBG(Continuation),
+ call({?FUNCTION_NAME, Continuation}).
select(Alias, Tab, Ms) ->
- Res = select(Alias, Tab, Ms, 100000),
- select_1(Res).
-
-select_1('$end_of_table') -> [];
-select_1({Acc, C}) ->
- case ets:select(C) of
- '$end_of_table' -> Acc;
- {New, Cont} ->
- select_1({New ++ Acc, Cont})
- end.
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Ms}),
+ call({?FUNCTION_NAME, Alias, Tab, Ms}).
-select(ext_ets, Tab, Ms, Limit) when is_integer(Limit); Limit =:= infinity ->
- ets:select(mnesia_lib:val({?MODULE,Tab}), Ms, Limit).
+select(Alias, Tab, Ms, Limit) ->
+ ?DBG({Alias, ext_test_server:tab_to_list(Tab), Ms, Limit}),
+ call({?FUNCTION_NAME, Alias, Tab, Ms, Limit}).
repair_continuation(Cont, Ms) ->
- ets:repair_continuation(Cont, Ms).
+ ?DBG({Cont, Ms}),
+ call({?FUNCTION_NAME, Cont, Ms}).
+
+call(Req) ->
+ error_if_not_initialized(),
+ case gen_server:call({global, mnesia_test_lib:get_ext_test_server_name()}, Req) of
+ #exception{c = Class, r = Reason, st = ST} = Ex ->
+ ?DBG("call ~p resulted in an exception: ~p~n", [Req, Ex]),
+ erlang:raise(Class, Reason, ST);
+ Res ->
+ Res
+ end.
diff --git a/lib/mnesia/test/mnesia_config_test.erl b/lib/mnesia/test/mnesia_config_test.erl
index 4ba560e25d..9646655aef 100644
--- a/lib/mnesia/test/mnesia_config_test.erl
+++ b/lib/mnesia/test/mnesia_config_test.erl
@@ -730,8 +730,8 @@ backend_plugin_registration(doc) ->
backend_plugin_registration(Config) when is_list(Config) ->
Nodes = ?acquire_schema(1, [{default_properties, []} | Config]),
?match(ok, mnesia:start()),
- ?match({atomic,ok}, mnesia:add_backend_type(ext_ets, ext_test)),
- ?match({atomic,ok}, mnesia:add_backend_type(ext_dets, ext_test)),
+ ?match({atomic,ok}, mnesia:add_backend_type(ext_ram_copies, ext_test)),
+ ?match({atomic,ok}, mnesia:add_backend_type(ext_disc_only_copies, ext_test)),
?verify_mnesia(Nodes, []),
?cleanup(1, Config).
diff --git a/lib/mnesia/test/mnesia_dirty_access_test.erl b/lib/mnesia/test/mnesia_dirty_access_test.erl
index e684faf7b0..ba7e04ff1e 100644
--- a/lib/mnesia/test/mnesia_dirty_access_test.erl
+++ b/lib/mnesia/test/mnesia_dirty_access_test.erl
@@ -162,7 +162,7 @@ dirty_write_disc_only(Config) when is_list(Config) ->
dirty_write(Config, disc_only_copies).
dirty_write_xets(Config) when is_list(Config) ->
- dirty_write(Config, ext_ets).
+ dirty_write(Config, ext_ram_copies).
dirty_write(Config, Storage) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
@@ -196,7 +196,7 @@ dirty_read_disc_only(Config) when is_list(Config) ->
dirty_read(Config, disc_only_copies).
dirty_read_xets(Config) when is_list(Config) ->
- dirty_read(Config, ext_ets).
+ dirty_read(Config, ext_ram_copies).
dirty_read(Config, Storage) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
@@ -242,7 +242,7 @@ dirty_update_counter_disc_only(Config) when is_list(Config) ->
dirty_update_counter(Config, disc_only_copies).
dirty_update_counter_xets(Config) when is_list(Config) ->
- dirty_update_counter(Config, ext_ets).
+ dirty_update_counter(Config, ext_ram_copies).
dirty_update_counter(Config, Storage) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
@@ -255,7 +255,7 @@ dirty_update_counter(Config, Storage) ->
?match({'EXIT', _}, mnesia:dirty_update_counter({Tab}, 3)),
?match({'EXIT', _}, mnesia:dirty_update_counter({foo, 1}, 3)),
?match(5, mnesia:dirty_update_counter({Tab, 1}, 3)),
- ?match([{Tab, 1, 5}], mnesia:dirty_read({Tab, 1})),
+ ?match([{Tab, 1, 5}], mnesia:dirty_read({Tab, 1})),
?match({atomic, 8}, mnesia:transaction(fun() ->
mnesia:dirty_update_counter({Tab, 1}, 3) end)),
@@ -287,7 +287,7 @@ dirty_delete_disc_only(Config) when is_list(Config) ->
dirty_delete(Config, disc_only_copies).
dirty_delete_xets(Config) when is_list(Config) ->
- dirty_delete(Config, ext_ets).
+ dirty_delete(Config, ext_ram_copies).
dirty_delete(Config, Storage) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
@@ -327,7 +327,7 @@ dirty_delete_object_disc_only(Config) when is_list(Config) ->
dirty_delete_object(Config, disc_only_copies).
dirty_delete_object_xets(Config) when is_list(Config) ->
- dirty_delete_object(Config, ext_ets).
+ dirty_delete_object(Config, ext_ram_copies).
dirty_delete_object(Config, Storage) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
@@ -373,7 +373,7 @@ dirty_match_object_disc_only(Config) when is_list(Config) ->
dirty_match_object(Config, disc_only_copies).
dirty_match_object_xets(Config) when is_list(Config) ->
- dirty_match_object(Config, ext_ets).
+ dirty_match_object(Config, ext_ram_copies).
dirty_match_object(Config, Storage) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
@@ -412,7 +412,7 @@ dirty_index_match_object_disc_only(Config) when is_list(Config) ->
dirty_index_match_object(Config, disc_only_copies).
dirty_index_match_object_xets(Config) when is_list(Config) ->
- dirty_index_match_object(Config, ext_ets).
+ dirty_index_match_object(Config, ext_ram_copies).
dirty_index_match_object(Config, Storage) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
@@ -452,7 +452,7 @@ dirty_index_read_disc_only(Config) when is_list(Config) ->
dirty_index_read(Config, disc_only_copies).
dirty_index_read_xets(Config) when is_list(Config) ->
- dirty_index_read(Config, ext_ets).
+ dirty_index_read(Config, ext_ram_copies).
dirty_index_read(Config, Storage) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
@@ -516,7 +516,7 @@ dirty_index_update_set_disc_only(Config) when is_list(Config) ->
dirty_index_update_set(Config, disc_only_copies).
dirty_index_update_set_xets(Config) when is_list(Config) ->
- dirty_index_update_set(Config, ext_ets).
+ dirty_index_update_set(Config, ext_ram_copies).
dirty_index_update_set(Config, Storage) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
@@ -611,7 +611,7 @@ dirty_index_update_bag_disc_only(Config)when is_list(Config) ->
dirty_index_update_bag(Config, disc_only_copies).
dirty_index_update_bag_xets(Config) when is_list(Config) ->
- dirty_index_update_bag(Config, ext_ets).
+ dirty_index_update_bag(Config, ext_ram_copies).
dirty_index_update_bag(Config, Storage) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
@@ -732,7 +732,7 @@ dirty_iter_disc_only(Config) when is_list(Config) ->
dirty_iter(Config, disc_only_copies).
dirty_iter_xets(Config) when is_list(Config) ->
- dirty_iter(Config, ext_ets).
+ dirty_iter(Config, ext_ram_copies).
dirty_iter(Config, Storage) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
diff --git a/lib/mnesia/test/mnesia_evil_coverage_test.erl b/lib/mnesia/test/mnesia_evil_coverage_test.erl
index db2903d777..763d9054b7 100644
--- a/lib/mnesia/test/mnesia_evil_coverage_test.erl
+++ b/lib/mnesia/test/mnesia_evil_coverage_test.erl
@@ -165,11 +165,11 @@ table_info(Config) when is_list(Config) ->
Schema =
case mnesia_test_lib:diskless(Config) of
true -> [{type, Type}, {attributes, Attrs}, {index, [ValPos]},
- {ram_copies, [Node1, Node2]}, {ext_ets, [Node3]}];
+ {ram_copies, [Node1, Node2]}, {ext_ram_copies, [Node3]}];
false ->
[{type, Type}, {attributes, Attrs}, {index, [ValPos]},
{disc_only_copies, [Node1]}, {ram_copies, [Node2]},
- {ext_ets, [Node3]}]
+ {ext_ram_copies, [Node3]}]
end,
?match({atomic, ok}, mnesia:create_table(Tab, Schema)),
@@ -182,7 +182,7 @@ table_info(Config) when is_list(Config) ->
true ->
?match(Nodes, mnesia:table_info(Tab, ram_copies));
false ->
- ?match([Node3], mnesia:table_info(Tab, ext_ets)),
+ ?match([Node3], mnesia:table_info(Tab, ext_ram_copies)),
?match([Node2], mnesia:table_info(Tab, ram_copies)),
?match([Node1], mnesia:table_info(Tab, mnesia_test_lib:storage_type(disc_only_copies, Config)))
end,
@@ -258,7 +258,7 @@ db_node_lifecycle(Config) when is_list(Config) ->
L1 = mnesia:table_info(T, ram_copies),
L2 = mnesia:table_info(T, disc_copies),
L3 = mnesia:table_info(T, disc_only_copies),
- L4 = mnesia:table_info(T, ext_ets),
+ L4 = mnesia:table_info(T, ext_ram_copies),
L1 ++ L2 ++ L3 ++ L4
end,
@@ -318,7 +318,7 @@ db_node_lifecycle(Config) when is_list(Config) ->
[{name, Tab3}, {ram_copies, [Node2, Node3]}],
[{name, Tab4}, {disc_only_copies, [Node1]}],
[{name, Tab5}, {disc_only_copies, [Node2]}],
- [{name, Tab6}, {ext_ets, [Node1, Node2]}]
+ [{name, Tab6}, {ext_ram_copies, [Node1, Node2]}]
],
[?match({atomic, ok}, mnesia:create_table(T)) || T <- Tabs ],
@@ -422,7 +422,7 @@ checkpoint(NodeConfig, Config) ->
CreateTab(Type, 3, [lists:last(TabNodes)])] ++
Acc
end,
- Types = [ram_copies, disc_copies, disc_only_copies, ext_ets],
+ Types = [ram_copies, disc_copies, disc_only_copies, ext_ram_copies],
Tabs = lists:foldl(CreateTabs, [], Types),
Recs = ?sort([{T, N, N} || T <- Tabs, N <- lists:seq(1, 10)]),
lists:foreach(fun(R) -> ?match(ok, mnesia:dirty_write(R)) end, Recs),
@@ -509,7 +509,7 @@ replica_location(Config) when is_list(Config) ->
{ram_copies, [Node2]}, {disc_copies, [Node3]}]),
Check(ext_location, [{disc_only_copies, [Node1]},
- {ext_ets, [Node2]}, {disc_copies, [Node3]}]),
+ {ext_ram_copies, [Node2]}, {disc_copies, [Node3]}]),
?verify_mnesia(Nodes, []).
@@ -872,7 +872,7 @@ replica_management(Config) when is_list(Config) ->
%%
?match({atomic, ok},
mnesia:create_table([{name, Tab}, {attributes, Attrs},
- {ram_copies, [Node1]}, {ext_ets, [Node3]}])),
+ {ram_copies, [Node1]}, {ext_ram_copies, [Node3]}])),
[?match(ok, mnesia:dirty_write({Tab, K, K + 2})) || K <-lists:seq(1, 10)],
?match([], ?vrl(Tab, [], [Node1, Node3], [], Nodes)),
%% R - -
@@ -909,7 +909,7 @@ replica_management(Config) when is_list(Config) ->
?match([], ?vrl(Tab, [Node2], [], [Node1], Nodes)),
?match([0,10,10], ?SS(rpc:multicall(Nodes, mnesia, table_info, [Tab, size]))),
%% D DO -
- ?match({atomic, ok}, mnesia:add_table_copy(Tab, Node3, ext_ets)),
+ ?match({atomic, ok}, mnesia:add_table_copy(Tab, Node3, ext_ram_copies)),
?match([], ?vrl(Tab, [Node2], [Node3], [Node1], Nodes)),
?match([10,10,10], ?SS(rpc:multicall(Nodes, mnesia, table_info, [Tab, size]))),
%% D DO R
@@ -936,7 +936,7 @@ replica_management(Config) when is_list(Config) ->
?match([10,10,10], ?SS(rpc:multicall(Nodes, mnesia, table_info, [Tab, size]))),
%% D DO D0
- ?match({atomic, ok}, mnesia:change_table_copy_type(Tab, Node3, ext_ets)),
+ ?match({atomic, ok}, mnesia:change_table_copy_type(Tab, Node3, ext_ram_copies)),
?match([], ?vrl(Tab, [Node2], [Node3], [Node1], Nodes)),
?match([10,10,10], ?SS(rpc:multicall(Nodes, mnesia, table_info, [Tab, size]))),
%% D DO R
@@ -993,7 +993,7 @@ replica_management(Config) when is_list(Config) ->
?match([], ?vrl(Tab, [Node3], [], [Node2], Nodes)),
?match([0,10,10], ?SS(rpc:multicall(Nodes, mnesia, table_info, [Tab, size]))),
%% - D DO
- ?match({atomic, ok}, mnesia:change_table_copy_type(Tab, Node3, ext_ets)),
+ ?match({atomic, ok}, mnesia:change_table_copy_type(Tab, Node3, ext_ram_copies)),
?match([], ?vrl(Tab, [], [Node3], [Node2], Nodes)),
?match([0,10,10], ?SS(rpc:multicall(Nodes, mnesia, table_info, [Tab, size]))),
%% - D ER
@@ -2428,7 +2428,7 @@ record_name_dirty_access_disc_only(Config) when is_list(Config) ->
record_name_dirty_access(disc_only_copies, Config).
record_name_dirty_access_xets(Config) when is_list(Config) ->
- record_name_dirty_access(ext_ets, Config).
+ record_name_dirty_access(ext_ram_copies, Config).
record_name_dirty_access(Storage, Config) ->
diff --git a/lib/mnesia/test/mnesia_test_lib.erl b/lib/mnesia/test/mnesia_test_lib.erl
index 6bf44295b3..6a2a61f378 100644
--- a/lib/mnesia/test/mnesia_test_lib.erl
+++ b/lib/mnesia/test/mnesia_test_lib.erl
@@ -103,6 +103,7 @@
start_mnesia/2,
start_appls/2,
start_appls/3,
+ start_ext_test_server/0,
start_wait/2,
storage_type/2,
stop_mnesia/1,
@@ -130,7 +131,8 @@
struct/1,
init_per_testcase/2,
end_per_testcase/2,
- kill_tc/2
+ kill_tc/2,
+ get_ext_test_server_name/0
]).
-include("mnesia_test_lib.hrl").
@@ -681,6 +683,10 @@ do_prepare([{start_appls, Appls} | Actions], Selected, All, Config, File, Line)
do_prepare(Actions, Selected, All, Config, File, Line);
do_prepare([{reload_appls, Appls} | Actions], Selected, All, Config, File, Line) ->
reload_appls(Appls, Selected),
+ do_prepare(Actions, Selected, All, Config, File, Line);
+do_prepare([start_ext_test_server | Actions], Selected, All, Config, File, Line) ->
+ Expected = lists:duplicate(length(Selected), ok),
+ {Expected, []} = rpc:multicall(Selected, ?MODULE, start_ext_test_server, []),
do_prepare(Actions, Selected, All, Config, File, Line).
set_kill_timer(Config) ->
@@ -795,6 +801,20 @@ start_appls([Appl | Appls], Nodes, Config, Tabs) ->
start_appls([], _Nodes, _Config, _Tabs) ->
[].
+start_ext_test_server() ->
+ case global:whereis_name(get_ext_test_server_name()) of
+ Pid when is_pid(Pid) ->
+ gen_server:stop({global, get_ext_test_server_name()});
+ _ ->
+ ignore
+ end,
+ {ok, _} = gen_server:start({global, get_ext_test_server_name()}, ext_test_server,
+ [self()],
+ [{timeout, infinity}
+ %%, {debug, [trace]}
+ ]),
+ ok.
+
remote_start(mnesia, Config, Nodes) ->
case diskless(Config) of
true ->
@@ -1031,9 +1051,10 @@ verify_replica_location(Tab, DiscOnly0, Ram0, Disc0, AliveNodes0) ->
timer:sleep(100),
S1 = ?match(AliveNodes, lists:sort(mnesia:system_info(running_db_nodes))),
- S2 = ?match(DiscOnly, lists:sort(mnesia:table_info(Tab, disc_only_copies))),
+ S2 = ?match(DiscOnly, lists:sort(mnesia:table_info(Tab, disc_only_copies) ++
+ mnesia:table_info(Tab, ext_disc_only_copies))),
S3 = ?match(Ram, lists:sort(mnesia:table_info(Tab, ram_copies) ++
- mnesia:table_info(Tab, ext_ets))),
+ mnesia:table_info(Tab, ext_ram_copies))),
S4 = ?match(Disc, lists:sort(mnesia:table_info(Tab, disc_copies))),
S5 = ?match(Write, lists:sort(mnesia:table_info(Tab, where_to_write))),
S6 = case lists:member(This, Read) of
@@ -1070,3 +1091,6 @@ sort({ok, L}) when is_list(L) ->
{ok, lists:sort(L)};
sort(W) ->
W.
+
+get_ext_test_server_name() ->
+ list_to_atom("ext_test_server_" ++ atom_to_list(node())).
diff --git a/lib/mnesia/test/mnesia_test_lib.hrl b/lib/mnesia/test/mnesia_test_lib.hrl
index cee1bb003f..14aa4221a6 100644
--- a/lib/mnesia/test/mnesia_test_lib.hrl
+++ b/lib/mnesia/test/mnesia_test_lib.hrl
@@ -116,6 +116,7 @@
mnesia_test_lib:prepare_test_case([{init_test_case, [mnesia]},
delete_schema,
create_schema,
+ start_ext_test_server,
{start_appls, [mnesia]}],
N, Config, ?FILE, ?LINE)).
@@ -151,4 +152,4 @@
-define(verify_mnesia(Ups, Downs),
mnesia_test_lib:verify_mnesia(Ups, Downs, ?FILE, ?LINE)).
--define(BACKEND, [{backend_types, [{ext_ets, ext_test},{ext_dets, ext_test}]}]).
+-define(BACKEND, [{backend_types, [{ext_ram_copies, ext_test}, {ext_disc_only_copies, ext_test}]}]).
--
2.43.0