File 6641-erts-kernel-Fix-erlang-is_alive.patch of Package erlang

From af22a8bafaab092669c2249081081916f0810b09 Mon Sep 17 00:00:00 2001
From: Rickard Green <rickard@erlang.org>
Date: Wed, 25 May 2022 21:54:39 +0200
Subject: [PATCH 1/2] [erts, kernel] Fix erlang:is_alive()

Ensure that the erlang:is_alive() BIF doesn't return 'true' until the
configured distribution service is available.
---
 erts/emulator/test/distribution_SUITE.erl |  63 +++++++++++++++++++++-
 erts/preloaded/ebin/erlang.beam           | Bin 131988 -> 132056 bytes
 erts/preloaded/ebin/erts_internal.beam    | Bin 27924 -> 28608 bytes
 erts/preloaded/src/erlang.erl             |   2 +-
 erts/preloaded/src/erts.app.src           |   2 +-
 erts/preloaded/src/erts_internal.erl      |  26 +++++++++
 lib/kernel/src/kernel.app.src             |   2 +-
 lib/kernel/src/net_kernel.erl             |  28 +++++-----
 8 files changed, 103 insertions(+), 20 deletions(-)

diff --git a/erts/preloaded/src/erlang.erl b/erts/preloaded/src/erlang.erl
index afd7012a10..5b0294e276 100644
--- a/erts/preloaded/src/erlang.erl
+++ b/erts/preloaded/src/erlang.erl
@@ -1279,7 +1279,7 @@ iolist_to_iovec(_IoListOrBinary) ->
 %% is_alive/0
 -spec is_alive() -> boolean().
 is_alive() ->
-    erlang:whereis(net_kernel) =/= undefined.
+    erlang:node() =/= nonode@nohost orelse erts_internal:dynamic_node_name().
 
 %% is_builtin/3
 -spec erlang:is_builtin(Module, Function, Arity) -> boolean() when
diff --git a/erts/preloaded/src/erts_internal.erl b/erts/preloaded/src/erts_internal.erl
index b666ef0b00..2aa8739388 100644
--- a/erts/preloaded/src/erts_internal.erl
+++ b/erts/preloaded/src/erts_internal.erl
@@ -116,6 +116,8 @@
 
 -export([binary_to_integer/2, list_to_integer/2]).
 
+-export([dynamic_node_name/0, dynamic_node_name/1]).
+
 %%
 %% Await result of send to port
 %%
@@ -978,3 +980,27 @@ binary_to_integer(_Bin, _Base) ->
       Base :: 2..36.
 list_to_integer(_List, _Base) ->
     erlang:nif_error(undefined).
+
+%%
+%% Is dynamic node name enabled?
+%%
+-spec dynamic_node_name() -> boolean().
+
+dynamic_node_name() ->
+    case persistent_term:get({?MODULE, dynamic_node_name}, false) of
+        false -> false;
+        _ -> true
+    end.
+
+%%
+%% Save whether dynamic node name is enabled or not.
+%%
+-spec dynamic_node_name(boolean()) -> ok.
+
+dynamic_node_name(true) ->
+    persistent_term:put({?MODULE, dynamic_node_name}, true);
+dynamic_node_name(false) ->
+    case dynamic_node_name() of
+        false -> ok;
+        _ -> _ = persistent_term:erase({?MODULE, dynamic_node_name}), ok
+    end.
diff --git a/lib/kernel/src/net_kernel.erl b/lib/kernel/src/net_kernel.erl
index 76279327b2..5db6ef2768 100644
--- a/lib/kernel/src/net_kernel.erl
+++ b/lib/kernel/src/net_kernel.erl
@@ -369,15 +369,15 @@ request(Req) ->
     end.
 
 retry_request_maybe(Req) ->
-    case persistent_term:get(net_kernel, undefined) of
-        dynamic_node_name ->
+    case erts_internal:dynamic_node_name() of
+        true ->
             %% net_kernel must be restarting due to lost connection
             %% toward the node that named us.
             %% We want reconnection attempts to succeed so we wait and retry.
             receive after 100 -> ok end,
             request(Req);
 
-        _ ->
+        false ->
             ignored
     end.
 
@@ -531,6 +531,7 @@ init(#{name := Name,
                         supervisor = Supervisor
 		       }};
 	Error ->
+            erts_internal:dynamic_node_name(false),
 	    {stop, Error}
     end.
 
@@ -857,12 +858,12 @@ handle_call(get_state, From, State) ->
                   net_sup -> static;
                   _ -> dynamic
               end,
-    {NameType,Name} = case {persistent_term:get(net_kernel, undefined), node()} of
-                          {undefined, Node} ->
+    {NameType,Name} = case {erts_internal:dynamic_node_name(), node()} of
+                          {false, Node} ->
                               {static, Node};
-                          {dynamic_node_name, nonode@nohost} ->
+                          {true, nonode@nohost} ->
                               {dynamic, undefined};
-                          {dynamic_node_name, Node} ->
+                          {true, Node} ->
                               {dynamic, Node}
                       end,
     NameDomain = case get(longnames) of
@@ -901,10 +902,7 @@ terminate(Reason, State) ->
         #state{supervisor = {restart, _}} ->
             ok;
         _ ->
-            case persistent_term:get(net_kernel, undefined) of
-                undefined -> ok;
-                _ -> persistent_term:erase(net_kernel)
-            end
+            erts_internal:dynamic_node_name(false)
     end,
 
     case Reason of
@@ -1885,10 +1883,10 @@ epmd_module() ->
 %% dist_listen() -> whether the erlang distribution should listen for connections
 %%
 dist_listen() ->
-    case persistent_term:get(net_kernel, undefined) of
-        dynamic_node_name ->
+    case erts_internal:dynamic_node_name() of
+        true ->
             false;
-        _ ->
+        false ->
             case init:get_argument(dist_listen) of
                 {ok,[[DoListen]]} ->
                     list_to_atom(DoListen) =/= false;
@@ -1928,7 +1926,7 @@ start_protos_no_listen(Node, [Proto | Ps], Ls, CleanHalt) ->
     {Name, "@"++_Host}  = split_node(Node),
     Ok = case Name of
              "undefined" ->
-                 persistent_term:put(net_kernel,dynamic_node_name),
+                 erts_internal:dynamic_node_name(true),
                  true;
              _ ->
                  (set_node(Node, create_creation()) =:= ok)
-- 
2.35.3

openSUSE Build Service is sponsored by