File 0452-erts-Fix-failing-ets_SUITE-delete_large_tab.patch of Package erlang
From eeeba55e65ebb22c5dab786bba2b302d85435a55 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Fri, 26 Feb 2021 14:55:33 +0100
Subject: [PATCH] erts: Fix failing ets_SUITE:delete_large_tab
Failed always in debug build since
b94a924bd0423f498aceb410ebebb3346cca12b6
as table still exists after first forced trap of ets:delete/1.
---
lib/stdlib/test/ets_SUITE.erl | 41 +++++++++++++++++++++++------------
1 file changed, 27 insertions(+), 14 deletions(-)
diff --git a/lib/stdlib/test/ets_SUITE.erl b/lib/stdlib/test/ets_SUITE.erl
index a7dd2341cc..ee259d26e6 100644
--- a/lib/stdlib/test/ets_SUITE.erl
+++ b/lib/stdlib/test/ets_SUITE.erl
@@ -216,8 +216,12 @@ groups() ->
init_per_suite(Config) ->
erts_debug:set_internal_state(available_internal_state, true),
- erts_debug:set_internal_state(ets_force_trap, true),
- Config.
+ case erts_debug:set_internal_state(ets_force_trap, true) of
+ ok ->
+ [{ets_force_trap, true} | Config];
+ notsup ->
+ Config
+ end.
end_per_suite(_Config) ->
stop_spawn_logger(),
@@ -4030,25 +4034,27 @@ delete_large_tab(Config) when is_list(Config) ->
KeyRange = 16#ffffff,
Data = [{erlang:phash2(I, KeyRange),I} || I <- lists:seq(1, 200000)],
EtsMem = etsmem(),
- repeat_for_opts(fun(Opts) -> delete_large_tab_do(key_range(Opts,KeyRange),
- Data) end),
+ repeat_for_opts(fun(Opts) -> delete_large_tab_do(Config,
+ key_range(Opts,KeyRange),
+ Data)
+ end),
verify_etsmem(EtsMem).
-delete_large_tab_do(Opts,Data) ->
- delete_large_tab_1(foo_hash, Opts, Data, false),
- delete_large_tab_1(foo_tree, [ordered_set | Opts], Data, false),
- delete_large_tab_1(foo_tree, [stim_cat_ord_set | Opts], Data, false),
- delete_large_tab_1(foo_hash_fix, Opts, Data, true).
+delete_large_tab_do(Config, Opts,Data) ->
+ delete_large_tab_1(Config, foo_hash, Opts, Data, false),
+ delete_large_tab_1(Config, foo_tree, [ordered_set | Opts], Data, false),
+ delete_large_tab_1(Config, foo_tree, [stim_cat_ord_set | Opts], Data, false),
+ delete_large_tab_1(Config, foo_hash_fix, Opts, Data, true).
-delete_large_tab_1(Name, Flags, Data, Fix) ->
+delete_large_tab_1(Config, Name, Flags, Data, Fix) ->
case is_redundant_opts_combo(Flags) of
true -> skip;
false ->
- delete_large_tab_2(Name, Flags, Data, Fix)
+ delete_large_tab_2(Config, Name, Flags, Data, Fix)
end.
-delete_large_tab_2(Name, Flags, Data, Fix) ->
+delete_large_tab_2(Config, Name, Flags, Data, Fix) ->
Tab = ets_new(Name, Flags),
ets:insert(Tab, Data),
@@ -4061,14 +4067,21 @@ delete_large_tab_2(Name, Flags, Data, Fix) ->
{priority, Prio} = process_info(self(), priority),
Deleter = self(),
+ ForceTrap = proplists:get_bool(ets_force_trap, Config),
[SchedTracer]
= start_loopers(1,
Prio,
fun (SC) ->
receive
{trace, Deleter, out, _} ->
- undefined = ets:info(Tab),
- SC+1;
+ case {ets:info(Tab), SC, ForceTrap} of
+ {undefined, _, _} -> ok;
+ {_, 0, true} ->
+ %% Forced first trap of ets:delete,
+ %% tab still reachable
+ ok
+ end,
+ SC+1;
{trace,
Deleter,
register,
--
2.26.2