diff options
author | Sverker Eriksson <sverker@erlang.org> | 2021-06-03 18:06:47 +0200 |
---|---|---|
committer | Sverker Eriksson <sverker@erlang.org> | 2021-06-07 17:45:21 +0200 |
commit | 34d0f7f014e1a3dccd5d1e98a3ccb4348ba037ca (patch) | |
tree | ed743ac0b3c1ea46245fb77b4ffc129c0f950d44 | |
parent | 6d5a5f31c36bbdaad21585d25974177bd1b75e66 (diff) | |
download | erlang-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.erl | 17 |
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), |