summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRickard Green <rickard@erlang.org>2019-11-04 17:45:10 +0100
committerRickard Green <rickard@erlang.org>2019-11-21 11:54:30 +0100
commit0037f052716dd7ae39a13da3265381e9faea2e4d (patch)
tree1cde6f20b3c34860f7401cb08d8060ecb83224e9
parent5e5579e881c586421ab781ec7cb039d4ea8696ef (diff)
downloaderlang-0037f052716dd7ae39a13da3265381e9faea2e4d.tar.gz
net_kernel: save connection owners in map
-rw-r--r--lib/kernel/src/net_kernel.erl60
1 files changed, 32 insertions, 28 deletions
diff --git a/lib/kernel/src/net_kernel.erl b/lib/kernel/src/net_kernel.erl
index 677db1e33e..c96d4f22bb 100644
--- a/lib/kernel/src/net_kernel.erl
+++ b/lib/kernel/src/net_kernel.erl
@@ -102,7 +102,7 @@
tick, %% tick information
connecttime, %% the connection setuptime.
connections, %% table of connections
- conn_owners = [], %% List of connection owner pids,
+ conn_owners = #{}, %% Map of connection owner pids,
dist_ctrlrs = #{}, %% Map of dist controllers (local ports or pids),
pend_owners = [], %% List of potential owners
listen, %% list of #listen
@@ -405,8 +405,8 @@ do_auto_connect_2(Node, ConnId, From, State, ConnLookup) ->
_ ->
case setup(Node, ConnId, normal, From, State) of
{ok, SetupPid} ->
- Owners = [{SetupPid, Node} | State#state.conn_owners],
- {noreply,State#state{conn_owners=Owners}};
+ Owners = State#state.conn_owners,
+ {noreply,State#state{conn_owners=Owners#{SetupPid => Node}}};
_Error ->
?connect_failure(Node, {setup_call, failed, _Error}),
erts_internal:abort_pending_connection(Node, ConnId),
@@ -429,8 +429,8 @@ do_explicit_connect([#barred_connection{}], Type, Node, ConnId, From , State) ->
do_explicit_connect(_ConnLookup, Type, Node, ConnId, From , State) ->
case setup(Node,ConnId,Type,From,State) of
{ok, SetupPid} ->
- Owners = [{SetupPid, Node} | State#state.conn_owners],
- {noreply,State#state{conn_owners=Owners}};
+ Owners = State#state.conn_owners,
+ {noreply,State#state{conn_owners=Owners#{SetupPid => Node}}};
_Error ->
?connect_failure(Node, {setup_call, failed, _Error}),
{reply, false, State}
@@ -776,14 +776,10 @@ handle_info({AcceptPid, {accept_pending,MyNode,Node,Address,Type}}, State) ->
{'EXIT', OldOwner, _} ->
true
end,
- Owners = lists:keyreplace(OldOwner,
- 1,
- State#state.conn_owners,
- {AcceptPid, Node}),
ets:insert(sys_dist, Conn#connection{owner = AcceptPid}),
AcceptPid ! {self(),{accept_pending,ok_pending}},
- State1 = State#state{conn_owners=Owners},
- {noreply,State1}
+ Owners = maps:remove(OldOwner, State#state.conn_owners),
+ {noreply, State#state{conn_owners=Owners#{AcceptPid => Node}}}
end;
[#connection{state=up}=Conn] ->
AcceptPid ! {self(), {accept_pending, up_pending}},
@@ -804,8 +800,8 @@ handle_info({AcceptPid, {accept_pending,MyNode,Node,Address,Type}}, State) ->
address = Address,
type = Type}),
AcceptPid ! {self(),{accept_pending,ok}},
- Owners = [{AcceptPid,Node} | State#state.conn_owners],
- {noreply, State#state{conn_owners = Owners}}
+ Owners = State#state.conn_owners,
+ {noreply, State#state{conn_owners = Owners#{AcceptPid => Node}}}
catch
_:_ ->
error_logger:error_msg("~n** Cannot get connection id for node ~w~n",
@@ -816,7 +812,10 @@ handle_info({AcceptPid, {accept_pending,MyNode,Node,Address,Type}}, State) ->
end;
handle_info({SetupPid, {is_pending, Node}}, State) ->
- Reply = lists:member({SetupPid,Node},State#state.conn_owners),
+ Reply = case maps:get(SetupPid, State#state.conn_owners, undefined) of
+ Node -> true;
+ _ -> false
+ end,
SetupPid ! {self(), {is_pending, Reply}},
{noreply, State};
@@ -847,14 +846,22 @@ handle_info({From,badcookie,_To,_Mess}, State) ->
%%
handle_info(tick, State) ->
?tckr_dbg(tick),
- lists:foreach(fun({Pid,_Node}) -> Pid ! {self(), tick} end,
- State#state.conn_owners),
+ ok = maps:fold(fun (Pid, _Node, ok) ->
+ Pid ! {self(), tick},
+ ok
+ end,
+ ok,
+ State#state.conn_owners),
{noreply,State};
handle_info(aux_tick, State) ->
?tckr_dbg(aux_tick),
- lists:foreach(fun({Pid,_Node}) -> Pid ! {self(), aux_tick} end,
- State#state.conn_owners),
+ ok = maps:fold(fun (Pid, _Node, ok) ->
+ Pid ! {self(), aux_tick},
+ ok
+ end,
+ ok,
+ State#state.conn_owners),
{noreply,State};
handle_info(transition_period_end,
@@ -921,13 +928,10 @@ accept_exit(Pid, State) ->
false
end.
-conn_own_exit(Pid, Reason, State) ->
- Owners = State#state.conn_owners,
- case lists:keysearch(Pid, 1, Owners) of
- {value, {Pid, Node}} ->
- throw({noreply, nodedown(Pid, Node, Reason, State)});
- _ ->
- false
+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)})
end.
dist_ctrlr_exit(Pid, Reason, #state{dist_ctrlrs = DCs} = State) ->
@@ -987,7 +991,7 @@ get_conn(Node) ->
end.
delete_owner(Owner, #state{conn_owners = Owners} = State) ->
- State#state{conn_owners = lists:keydelete(Owner, 1, Owners)}.
+ State#state{conn_owners = maps:remove(Owner, Owners)}.
delete_ctrlr(Ctrlr, #state{dist_ctrlrs = DCs} = State) ->
State#state{dist_ctrlrs = maps:remove(Ctrlr, DCs)}.
@@ -1058,7 +1062,6 @@ up_pending_nodedown(#connection{owner = Owner,
Exited, Node, _Reason,
_Type, State) when Ctrlr =:= Exited ->
%% Controller exited!
- Owners = State#state.conn_owners,
Pend = lists:keydelete(AcceptPid, 1, State#state.pend_owners),
Conn1 = Conn#connection { owner = AcceptPid,
conn_id = erts_internal:new_connection(Node),
@@ -1067,7 +1070,8 @@ up_pending_nodedown(#connection{owner = Owner,
state = pending },
ets:insert(sys_dist, Conn1),
AcceptPid ! {self(), pending},
- State1 = State#state{conn_owners = [{AcceptPid,Node}|Owners],
+ Owners = State#state.conn_owners,
+ State1 = State#state{conn_owners = Owners#{AcceptPid => Node},
pend_owners = Pend},
delete_owner(Owner, delete_ctrlr(Ctrlr, State1));
up_pending_nodedown(#connection{owner = Owner},