File 3452-net_kernel-get_state.patch of Package erlang
From 53b170249170fdc80243301a927504f0a6748529 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Tue, 21 Dec 2021 17:50:03 +0100
Subject: [PATCH 2/2] net_kernel:get_state
---
lib/kernel/src/net_kernel.erl | 37 ++++++++++++++++++++++
lib/kernel/test/erl_distribution_SUITE.erl | 24 ++++++++++++--
2 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/lib/kernel/src/net_kernel.erl b/lib/kernel/src/net_kernel.erl
index f7839b07a6..8d172dbccd 100644
--- a/lib/kernel/src/net_kernel.erl
+++ b/lib/kernel/src/net_kernel.erl
@@ -71,6 +71,7 @@
protocol_childspecs/0,
epmd_module/0,
is_alive/0,
+ get_state/0,
dist_listen/0]).
-export([disconnect/1, async_disconnect/1, passive_cnct/1]).
@@ -194,6 +195,18 @@ nodename() -> request(nodename).
is_alive() ->
whereis(net_kernel) =/= undefined.
+get_state() ->
+ case whereis(net_kernel) of
+ undefined ->
+ case retry_request_maybe(get_state) of
+ ignored ->
+ #{started => no};
+ Reply ->
+ Reply
+ end;
+ _ ->
+ request(get_state)
+ end.
-spec stop() -> ok | {error, Reason} when
Reason :: not_allowed | not_found.
@@ -708,6 +721,30 @@ handle_call({setopts, Node, Opts}, From, State) ->
handle_call({getopts, Node, Opts}, From, State) ->
opts_node(getopts, Node, Opts, From, State);
+
+handle_call(get_state, From, State) ->
+ Started = case State#state.supervisor of
+ net_sup -> static;
+ _ -> dynamic
+ end,
+ {NameType,Name} = case {persistent_term:get(net_kernel, undefined), node()} of
+ {undefined, Node} ->
+ {static, Node};
+ {dynamic_node_name, nonode@nohost} ->
+ {dynamic, undefined};
+ {dynamic_node_name, Node} ->
+ {dynamic, Node}
+ end,
+ DomainType = case get(longnames) of
+ true -> long;
+ false -> short
+ end,
+ Return = #{started => Started,
+ name_type => NameType,
+ name => Name,
+ domain_type => DomainType},
+ async_reply({reply, Return, State}, From);
+
handle_call(_Msg, _From, State) ->
{noreply, State}.
diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl
index 238f4d3365..3442503f4e 100644
--- a/lib/kernel/test/erl_distribution_SUITE.erl
+++ b/lib/kernel/test/erl_distribution_SUITE.erl
@@ -540,21 +540,33 @@ dyn_node_name(Config) when is_list(Config) ->
dyn_node_name("", Config).
dyn_node_name(DCfg, _Config) ->
+ DomainType = case net_kernel:get_state() of
+ #{domain_type := short} -> "short";
+ #{domain_type := long} -> "long"
+ end,
{_N1F,Port1} = start_node_unconnected(DCfg ++ " -dist_listen false",
undefined, ?MODULE, run_remote_test,
- ["dyn_node_name_do", atom_to_list(node())]),
+ ["dyn_node_name_do", atom_to_list(node()),
+ DomainType]),
0 = wait_for_port_exit(Port1),
ok.
-dyn_node_name_do(TestNode, _Args) ->
+dyn_node_name_do(TestNode, [DomainTypeStr]) ->
nonode@nohost = node(),
[] = nodes(),
[] = nodes(hidden),
+ DomainType = list_to_atom(DomainTypeStr),
+ #{started := static, name_type := dynamic, name := undefined,
+ domain_type := DomainType} = net_kernel:get_state(),
net_kernel:monitor_nodes(true, [{node_type,all}]),
net_kernel:connect_node(TestNode),
[] = nodes(),
[TestNode] = nodes(hidden),
MyName = node(),
+ false = (MyName =:= undefined),
+ false = (MyName =:= nonode@nohost),
+ #{started := static, name_type := dynamic, name := MyName}
+ = net_kernel:get_state(),
check([MyName], rpc:call(TestNode, erlang, nodes, [hidden])),
{nodeup, MyName, [{node_type, visible}]} = receive_any(0),
@@ -567,11 +579,16 @@ dyn_node_name_do(TestNode, _Args) ->
{nodedown, MyName, [{node_type, visible}]} = receive_any(1000),
nonode@nohost = node(),
+ #{started := static, name_type := dynamic, name := undefined}
+ = net_kernel:get_state(),
net_kernel:connect_node(TestNode),
[] = nodes(),
[TestNode] = nodes(hidden),
MyName = node(),
+ #{started := static, name_type := dynamic, name := MyName}
+ = net_kernel:get_state(),
+
check([MyName], rpc:call(TestNode, erlang, nodes, [hidden])),
{nodeup, MyName, [{node_type, visible}]} = receive_any(0),
@@ -583,7 +600,8 @@ dyn_node_name_do(TestNode, _Args) ->
[] = nodes(hidden),
{nodedown, MyName, [{node_type, visible}]} = receive_any(1000),
nonode@nohost = node(),
-
+ #{started := static, name_type := dynamic, name := undefined}
+ = net_kernel:get_state(),
ok.
check(X, X) -> ok.
--
2.34.1