From 2f1456971af90c94d698f94318e4e26a1157c082 Mon Sep 17 00:00:00 2001 From: Sverker Eriksson Date: Fri, 4 Oct 2019 17:24:55 +0200 Subject: Guarantee nodedown before nodeup messages --- lib/kernel/test/erl_distribution_SUITE.erl | 102 ++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 1 deletion(-) (limited to 'lib/kernel/test/erl_distribution_SUITE.erl') diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl index 2b84a68c52..200ef244f2 100644 --- a/lib/kernel/test/erl_distribution_SUITE.erl +++ b/lib/kernel/test/erl_distribution_SUITE.erl @@ -41,6 +41,7 @@ monitor_nodes_combinations/1, monitor_nodes_cleanup/1, monitor_nodes_many/1, + monitor_nodes_down_up/1, dist_ctrl_proc_smoke/1]). %% Performs the test at another node. @@ -85,7 +86,8 @@ groups() -> monitor_nodes_node_type, monitor_nodes_misc, monitor_nodes_otp_6481, monitor_nodes_errors, monitor_nodes_combinations, monitor_nodes_cleanup, - monitor_nodes_many]}]. + monitor_nodes_many, + monitor_nodes_down_up]}]. init_per_suite(Config) -> Config. @@ -1465,6 +1467,104 @@ monitor_nodes_many(DCfg, _Config) -> MonNodeState = monitor_node_state(), ok. +%% Test order of messages nodedown and nodeup. +monitor_nodes_down_up(Config) when is_list(Config) -> + [An] = get_nodenames(1, monitor_nodeup), + {ok, A} = ct_slave:start(An), + + try + monitor_nodes_yoyo(A) + after + catch ct_slave:stop(A) + end. + +monitor_nodes_yoyo(A) -> + net_kernel:monitor_nodes(true), + Papa = self(), + + %% Spawn lots of processes doing one erlang:monitor_node(A,true) each + %% just to get lots of other monitors to fire when connection goes down + %% and thereby give time for {nodeup,A} to race before {nodedown,A}. + NodeMonCnt = 10000, + NodeMons = [my_spawn_opt(fun F() -> + monitor_node = receive_any(), + monitor_node(A, true), + Papa ! ready, + {nodedown, A} = receive_any(), + F() + end, + [link, monitor, {priority, low}]) + || + _ <- lists:seq(1, NodeMonCnt)], + + %% Spawn message spamming process to trigger new connection setups + %% as quick as possible. + Spammer = my_spawn_opt(fun F() -> + {dummy, A} ! trigger_auto_connect, + F() + end, + [link, monitor]), + + %% Now bring connection down and verify we get {nodedown,A} before {nodeup,A}. + Yoyos = 20, + [begin + [P ! monitor_node || P <- NodeMons], + [receive ready -> ok end || _ <- NodeMons], + + {Owner,_ConnId} = get_node_owner(A), + exit(Owner, kill), + + {nodedown, A} = receive_any(), + {nodeup, A} = receive_any() + end + || _ <- lists:seq(1,Yoyos)], + + unlink(Spammer), + exit(Spammer, die), + receive {'DOWN',_,process,Spammer,_} -> ok end, + + [begin unlink(P), exit(P, die) end || P <- NodeMons], + [receive {'DOWN',_,process,P,_} -> ok end || P <- NodeMons], + + net_kernel:monitor_nodes(false), + ok. + +receive_any() -> + receive_any(infinity). + +receive_any(Timeout) -> + receive + M -> M + after + Timeout -> timeout + end. + +my_spawn_opt(Fun, Opts) -> + case spawn_opt(Fun, Opts) of + {Pid, _Mref} -> Pid; + Pid -> Pid + end. + +-record(connection, { + node, %% remote node name + conn_id, %% Connection identity + state, %% pending | up | up_pending + owner, %% owner pid + pending_owner, %% possible new owner + address, %% #net_address + waiting = [], %% queued processes + type %% normal | hidden + }). + +get_node_owner(Node) -> + case ets:lookup(sys_dist, Node) of + [#connection{owner = Owner, conn_id = ConnId}] -> + {Owner, ConnId}; + _ -> + error + end. + + dist_ctrl_proc_smoke(Config) when is_list(Config) -> ThisNode = node(), [Name1, Name2] = get_nodenames(2, dist_ctrl_proc_example_smoke), -- cgit v1.2.1 From 2c1d5d4ffd9a6ccf72ca5ae4ae8700966116b9f3 Mon Sep 17 00:00:00 2001 From: Sverker Eriksson Date: Fri, 25 Oct 2019 19:22:52 +0200 Subject: kernel: Fix test case monitor_nodess_down_up --- lib/kernel/test/erl_distribution_SUITE.erl | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) (limited to 'lib/kernel/test/erl_distribution_SUITE.erl') diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl index 200ef244f2..e4fe27c619 100644 --- a/lib/kernel/test/erl_distribution_SUITE.erl +++ b/lib/kernel/test/erl_distribution_SUITE.erl @@ -1511,7 +1511,7 @@ monitor_nodes_yoyo(A) -> [P ! monitor_node || P <- NodeMons], [receive ready -> ok end || _ <- NodeMons], - {Owner,_ConnId} = get_node_owner(A), + Owner = get_conn_owner(A), exit(Owner, kill), {nodedown, A} = receive_any(), @@ -1545,25 +1545,10 @@ my_spawn_opt(Fun, Opts) -> Pid -> Pid end. --record(connection, { - node, %% remote node name - conn_id, %% Connection identity - state, %% pending | up | up_pending - owner, %% owner pid - pending_owner, %% possible new owner - address, %% #net_address - waiting = [], %% queued processes - type %% normal | hidden - }). - -get_node_owner(Node) -> - case ets:lookup(sys_dist, Node) of - [#connection{owner = Owner, conn_id = ConnId}] -> - {Owner, ConnId}; - _ -> - error - end. - +get_conn_owner(Node) -> + {ok, NodeInfo} = net_kernel:node_info(Node), + {value,{owner, Owner}} = lists:keysearch(owner, 1, NodeInfo), + Owner. dist_ctrl_proc_smoke(Config) when is_list(Config) -> ThisNode = node(), -- cgit v1.2.1 From 7c212cefe9fdc4a3a788859d1298729f6fb8e5b9 Mon Sep 17 00:00:00 2001 From: Rickard Green Date: Sat, 9 Apr 2022 03:27:19 +0200 Subject: [erts,kernel] Connection ID information --- lib/kernel/test/erl_distribution_SUITE.erl | 99 ++++++++++++++++++++++++++---- 1 file changed, 86 insertions(+), 13 deletions(-) (limited to 'lib/kernel/test/erl_distribution_SUITE.erl') diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl index e4fe27c619..7d7108e44b 100644 --- a/lib/kernel/test/erl_distribution_SUITE.erl +++ b/lib/kernel/test/erl_distribution_SUITE.erl @@ -1108,7 +1108,9 @@ monitor_nodes_misc(DCfg, _Config) -> MonNodeState = monitor_node_state(), ok = net_kernel:monitor_nodes(true), ok = net_kernel:monitor_nodes(true, [{node_type, all}, nodedown_reason]), - ok = net_kernel:monitor_nodes(true, [nodedown_reason, {node_type, all}]), + ok = net_kernel:monitor_nodes(true, [nodedown_reason, {node_type, all}, connection_id]), + ok = net_kernel:monitor_nodes(true, #{node_type => all, nodedown_reason => true}), + ok = net_kernel:monitor_nodes(true, #{node_type => all, nodedown_reason => true, connection_id => true}), Names = get_numbered_nodenames(3, node), [NN1, NN2, NN3] = Names, @@ -1117,27 +1119,90 @@ monitor_nodes_misc(DCfg, _Config) -> receive {nodeup, N1} -> ok end, + receive {nodeup, N1, #{node_type := visible}} -> ok end, + receive {nodeup, N2, #{node_type := hidden}} -> ok end, receive {nodeup, N1, [{node_type, visible}]} -> ok end, - receive {nodeup, N1, [{node_type, visible}]} -> ok end, - receive {nodeup, N2, [{node_type, hidden}]} -> ok end, receive {nodeup, N2, [{node_type, hidden}]} -> ok end, + NodesInfo = erlang:nodes(connected, #{connection_id => true}), + + {N1, #{connection_id := N1CId}} = lists:keyfind(N1, 1, NodesInfo), + {N2, #{connection_id := N2CId}} = lists:keyfind(N2, 1, NodesInfo), + + ct:pal("N1: ~p ~p~n", [N1, N1CId]), + ct:pal("N2: ~p ~p~n", [N2, N2CId]), + + receive {nodeup, N1, #{node_type := visible, connection_id := N1CId}} -> ok end, + receive {nodeup, N2, #{node_type := hidden, connection_id := N2CId}} -> ok end, + + N1UpInfoSorted = lists:sort([{node_type, visible},{connection_id, N1CId}]), + N2UpInfoSorted = lists:sort([{node_type, hidden},{connection_id, N2CId}]), + + receive {nodeup, N1, UpN1Info} -> N1UpInfoSorted = lists:sort(UpN1Info) end, + receive {nodeup, N2, UpN2Info} -> N2UpInfoSorted = lists:sort(UpN2Info) end, + stop_node(N1), stop_node(N2), - VisbleDownInfo = lists:sort([{node_type, visible}, - {nodedown_reason, connection_closed}]), - HiddenDownInfo = lists:sort([{node_type, hidden}, - {nodedown_reason, connection_closed}]), - receive {nodedown, N1} -> ok end, - receive {nodedown, N1, Info1A} -> VisbleDownInfo = lists:sort(Info1A) end, - receive {nodedown, N1, Info1B} -> VisbleDownInfo = lists:sort(Info1B) end, - receive {nodedown, N2, Info2A} -> HiddenDownInfo = lists:sort(Info2A) end, - receive {nodedown, N2, Info2B} -> HiddenDownInfo = lists:sort(Info2B) end, + receive {nodedown, N1, #{node_type := visible, + nodedown_reason := connection_closed}} -> ok end, + receive {nodedown, N1, #{node_type := visible, + nodedown_reason := connection_closed, + connection_id := N1CId}} -> ok end, + receive {nodedown, N2, #{node_type := hidden, + nodedown_reason := connection_closed}} -> ok end, + receive {nodedown, N2, #{node_type := hidden, + nodedown_reason := connection_closed, + connection_id := N2CId}} -> ok end, + + N1ADownInfoSorted = lists:sort([{node_type, visible}, + {nodedown_reason, connection_closed}]), + N1BDownInfoSorted = lists:sort([{node_type, visible}, + {nodedown_reason, connection_closed}, + {connection_id, N1CId}]), + N2ADownInfoSorted = lists:sort([{node_type, hidden}, + {nodedown_reason, connection_closed}]), + N2BDownInfoSorted = lists:sort([{node_type, hidden}, + {nodedown_reason, connection_closed}, + {connection_id, N2CId}]), + + receive + {nodedown, N1, N1Info1} -> + case lists:sort(N1Info1) of + N1ADownInfoSorted -> + receive + {nodedown, N1, N1Info2} -> + N1BDownInfoSorted = lists:sort(N1Info2) + end; + N1BDownInfoSorted -> + receive + {nodedown, N1, N1Info2} -> + N1ADownInfoSorted = lists:sort(N1Info2) + end + end + end, + receive + {nodedown, N2, N2Info1} -> + case lists:sort(N2Info1) of + N2ADownInfoSorted -> + receive + {nodedown, N2, N2Info2} -> + N2BDownInfoSorted = lists:sort(N2Info2) + end; + N2BDownInfoSorted -> + receive + {nodedown, N2, N2Info2} -> + N2ADownInfoSorted = lists:sort(N2Info2) + end + end + end, ok = net_kernel:monitor_nodes(false, [{node_type, all}, nodedown_reason]), + ok = net_kernel:monitor_nodes(false, [nodedown_reason, {node_type, all}, connection_id]), + ok = net_kernel:monitor_nodes(false, #{node_type => all, nodedown_reason => true}), + ok = net_kernel:monitor_nodes(false, #{node_type => all, nodedown_reason => true, connection_id => true}), {ok, N3} = start_node(DCfg, NN3), receive {nodeup, N3} -> ok end, @@ -1273,7 +1338,11 @@ monitor_nodes_errors(Config) when is_list(Config) -> [gurka]}} = net_kernel:monitor_nodes(true, [gurka]), {error, - {options_not_a_list, + {unknown_options, + #{gurka := true}}} = net_kernel:monitor_nodes(true, + #{gurka => true}), + {error, + {invalid_options, gurka}} = net_kernel:monitor_nodes(true, gurka), {error, @@ -1295,6 +1364,10 @@ monitor_nodes_errors(Config) when is_list(Config) -> {node_type, blaha}}} = net_kernel:monitor_nodes(true, [{node_type, blaha}]), + {error, + {bad_option_value, + #{node_type := blaha}}} + = net_kernel:monitor_nodes(true, #{node_type => blaha}), MonNodeState = monitor_node_state(), ok. -- cgit v1.2.1 From 1d0fe6f71c320d2d1d19d9efd6dcba7b18bedca6 Mon Sep 17 00:00:00 2001 From: Rickard Green Date: Fri, 22 Apr 2022 18:42:00 +0200 Subject: [kernel] Introduce connect_all kernel parameter Also fix the '-connect_all' command line argument. --- lib/kernel/test/erl_distribution_SUITE.erl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'lib/kernel/test/erl_distribution_SUITE.erl') diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl index 7d7108e44b..a22635dd68 100644 --- a/lib/kernel/test/erl_distribution_SUITE.erl +++ b/lib/kernel/test/erl_distribution_SUITE.erl @@ -771,8 +771,14 @@ run_tick_change_test(DCfg, B, C, PrevTT, TT) -> hidden_node(Config) when is_list(Config) -> run_dist_configs(fun hidden_node/2, Config). -hidden_node(DCfg, _Config) -> - HArgs = "-hidden", +hidden_node(DCfg, Config) -> + hidden_node(DCfg, "-hidden", Config), + hidden_node(DCfg, "-hidden -hidden", Config), + hidden_node(DCfg, "-hidden true -hidden true", Config), + ok. + +hidden_node(DCfg, HArgs, _Config) -> + ct:pal("--- Hidden argument(s): ~s~n", [HArgs]), {ok, V} = start_node(DCfg, visible_node), VMN = start_monitor_nodes_proc(V), {ok, H} = start_node(DCfg, hidden_node, HArgs), -- cgit v1.2.1