summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSverker Eriksson <sverker@erlang.org>2021-06-03 18:06:47 +0200
committerSverker Eriksson <sverker@erlang.org>2021-06-07 17:45:21 +0200
commit34d0f7f014e1a3dccd5d1e98a3ccb4348ba037ca (patch)
treeed743ac0b3c1ea46245fb77b4ffc129c0f950d44
parent6d5a5f31c36bbdaad21585d25974177bd1b75e66 (diff)
downloaderlang-34d0f7f014e1a3dccd5d1e98a3ccb4348ba037ca.tar.gz
kernel: Fix hanging net_kernel
Symptom: net_kernel hanging waiting for {'EXIT', OldOwner, _} Problem: OldOwner has already exited and the exit message has already been handled. This is possible to happen because erts_internal:abort_pending_connection can return false in pending_nodedown() which does not change the connection state in sys_dist ETS table. I does however remove the owner pid from state.conn_owners which this fix uses.
-rw-r--r--lib/kernel/src/net_kernel.erl17
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/kernel/src/net_kernel.erl b/lib/kernel/src/net_kernel.erl
index b857000a80..4c8dd1e2b5 100644
--- a/lib/kernel/src/net_kernel.erl
+++ b/lib/kernel/src/net_kernel.erl
@@ -796,12 +796,17 @@ handle_info({AcceptPid, {accept_pending,MyNode,Node,Address,Type}}, State) ->
%% change pending process.
%%
OldOwner = Conn#connection.owner,
- ?debug({net_kernel, remark, old, OldOwner, new, AcceptPid}),
- exit(OldOwner, remarked),
- receive
- {'EXIT', OldOwner, _} ->
- true
- end,
+ case maps:is_key(OldOwner, State#state.conn_owners) of
+ true ->
+ ?debug({net_kernel, remark, old, OldOwner, new, AcceptPid}),
+ exit(OldOwner, remarked),
+ receive
+ {'EXIT', OldOwner, _} ->
+ true
+ end;
+ false ->
+ ok % Owner already exited
+ end,
ets:insert(sys_dist, Conn#connection{owner = AcceptPid}),
AcceptPid ! {self(),{accept_pending,ok_pending}},
Owners = maps:remove(OldOwner, State#state.conn_owners),