File 2871-Improve-traceability.patch of Package erlang
From 954e4bac432b5ce81f44ca4b2b8287e6544bb0c0 Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Wed, 12 Oct 2022 17:07:44 +0200
Subject: [PATCH 1/2] Improve traceability
---
lib/kernel/src/dist_util.erl | 4 +--
lib/kernel/src/net_kernel.erl | 54 +++++++++++++++++++++++------------
2 files changed, 38 insertions(+), 20 deletions(-)
diff --git a/lib/kernel/src/dist_util.erl b/lib/kernel/src/dist_util.erl
index cfda284ad7..f7a9ba4898 100644
--- a/lib/kernel/src/dist_util.erl
+++ b/lib/kernel/src/dist_util.erl
@@ -737,8 +737,8 @@ recv_name(#hs_data{socket = Socket, f_recv = Recv} = HSData) ->
recv_name_old(HSData, Data);
{ok, [$N | _] = Data} ->
recv_name_new(HSData, Data);
- _ ->
- ?shutdown(no_node)
+ Other ->
+ ?shutdown({no_node, Other})
end.
%% OTP 25.3:
diff --git a/lib/kernel/src/net_kernel.erl b/lib/kernel/src/net_kernel.erl
index 1dd3631863..79d542b1f5 100644
--- a/lib/kernel/src/net_kernel.erl
+++ b/lib/kernel/src/net_kernel.erl
@@ -1170,7 +1170,6 @@ handle_info({AcceptPid, {wait_pending, Node}}, State) ->
%% Handle different types of process terminations.
%%
handle_info({'EXIT', From, Reason}, State) ->
- verbose({'EXIT', From, Reason}, 1, State),
handle_exit(From, Reason, State);
%%
@@ -1284,30 +1283,33 @@ handle_exit(Pid, Reason, State) ->
catch do_handle_exit(Pid, Reason, State).
do_handle_exit(Pid, Reason, State) ->
- listen_exit(Pid, State),
- accept_exit(Pid, State),
+ listen_exit(Pid, Reason, State),
+ accept_exit(Pid, Reason, State),
conn_own_exit(Pid, Reason, State),
dist_ctrlr_exit(Pid, Reason, State),
- pending_own_exit(Pid, State),
- ticker_exit(Pid, State),
- restarter_exit(Pid, State),
+ pending_own_exit(Pid, Reason, State),
+ ticker_exit(Pid, Reason, State),
+ restarter_exit(Pid, Reason, State),
+ verbose({'EXIT', Pid, Reason}, 1, State),
{noreply,State}.
-listen_exit(Pid, State) ->
+listen_exit(Pid, Reason, State) ->
case lists:keymember(Pid, ?LISTEN_ID, State#state.listen) of
true ->
+ verbose({listen_exit, Pid, Reason}, 1, State),
error_msg("** Netkernel terminating ... **\n", []),
throw({stop,no_network,State});
false ->
false
end.
-accept_exit(Pid, State) ->
+accept_exit(Pid, Reason, State) ->
Listen = State#state.listen,
case lists:keysearch(Pid, ?ACCEPT_ID, Listen) of
{value, ListenR} ->
ListenS = ListenR#listen.listen,
Mod = ListenR#listen.module,
+ verbose({accept_exit, Pid, Reason, Mod}, 1, State),
AcceptPid = Mod:accept(ListenS),
L = lists:keyreplace(Pid, ?ACCEPT_ID, Listen,
ListenR#listen{accept = AcceptPid}),
@@ -1319,16 +1321,20 @@ accept_exit(Pid, State) ->
conn_own_exit(Pid, Reason, #state{conn_owners = Owners} = State) ->
case maps:get(Pid, Owners, undefined) of
undefined -> false;
- Node -> throw({noreply, nodedown(Pid, Node, Reason, State)})
+ Node ->
+ verbose({conn_own_exit, Pid, Reason, Node}, 1, State),
+ throw({noreply, nodedown(Pid, Node, Reason, State)})
end.
dist_ctrlr_exit(Pid, Reason, #state{dist_ctrlrs = DCs} = State) ->
case maps:get(Pid, DCs, undefined) of
undefined -> false;
- Node -> throw({noreply, nodedown(Pid, Node, Reason, State)})
+ Node ->
+ verbose({dist_ctrlr_exit, Pid, Reason, Node}, 1, State),
+ throw({noreply, nodedown(Pid, Node, Reason, State)})
end.
-pending_own_exit(Pid, #state{pend_owners = Pend} = State) ->
+pending_own_exit(Pid, Reason, #state{pend_owners = Pend} = State) ->
case maps:get(Pid, Pend, undefined) of
undefined ->
false;
@@ -1336,31 +1342,43 @@ pending_own_exit(Pid, #state{pend_owners = Pend} = State) ->
State1 = State#state { pend_owners = maps:remove(Pid, Pend)},
case get_conn(Node) of
{ok, Conn} when Conn#connection.state =:= up_pending ->
+ verbose(
+ {pending_own_exit, Pid, Reason, Node, up_pending},
+ 1, State),
reply_waiting(Node,Conn#connection.waiting, true),
Conn1 = Conn#connection { state = up,
waiting = [],
pending_owner = undefined },
ets:insert(sys_dist, Conn1);
_ ->
+ verbose({pending_own_exit, Pid, Reason, Node}, 1, State),
ok
end,
throw({noreply, State1})
end.
-ticker_exit(Pid, #state{tick = #tick{ticker = Pid, time = T} = Tck} = State) ->
+ticker_exit(
+ Pid, Reason,
+ #state{tick = #tick{ticker = Pid, time = T} = Tck} = State) ->
+ verbose({ticker_exit, Pid, Reason, Tck}, 1, State),
Tckr = restart_ticker(T),
throw({noreply, State#state{tick = Tck#tick{ticker = Tckr}}});
-ticker_exit(Pid, #state{tick = #tick_change{ticker = Pid,
- time = T} = TckCng} = State) ->
+ticker_exit(
+ Pid, Reason,
+ #state{tick = #tick_change{ticker = Pid, time = T} = TckCng} = State) ->
+ verbose({ticker_exit, Pid, Reason, TckCng}, 1, State),
Tckr = restart_ticker(T),
- throw({noreply, State#state{tick = TckCng#tick_change{ticker = Tckr}}});
-ticker_exit(_, _) ->
+ throw({noreply, Reason, State#state{tick = TckCng#tick_change{ticker = Tckr}}});
+ticker_exit(_, _, _) ->
false.
-restarter_exit(Pid, State) ->
+restarter_exit(Pid, Reason, State) ->
case State#state.supervisor of
{restart, Pid} ->
- error_msg("** Distribution restart failed, net_kernel terminating... **\n", []),
+ verbose({restarter_exit, Pid, Reason}, 1, State),
+ error_msg(
+ "** Distribution restart failed, net_kernel terminating... **\n",
+ []),
throw({stop, restarter_exit, State});
_ ->
false
--
2.35.3