Merge pull request #11183 from keynslug/perf/EMQX-9591/routing

perf(broker): avoid usorting aggregated routes in a loop
This commit is contained in:
Andrew Mayorov 2023-07-03 19:16:25 +02:00 committed by GitHub
commit a127fd6571
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 12 deletions

View File

@ -285,16 +285,16 @@ aggre([#route{topic = To, dest = Node}]) when is_atom(Node) ->
aggre([#route{topic = To, dest = {Group, _Node}}]) ->
[{To, Group}];
aggre(Routes) ->
lists:foldl(
fun
(#route{topic = To, dest = Node}, Acc) when is_atom(Node) ->
[{To, Node} | Acc];
(#route{topic = To, dest = {Group, _Node}}, Acc) ->
lists:usort([{To, Group} | Acc])
end,
[],
Routes
).
aggre(Routes, false, []).
aggre([#route{topic = To, dest = Node} | Rest], Dedup, Acc) when is_atom(Node) ->
aggre(Rest, Dedup, [{To, Node} | Acc]);
aggre([#route{topic = To, dest = {Group, _Node}} | Rest], _Dedup, Acc) ->
aggre(Rest, true, [{To, Group} | Acc]);
aggre([], false, Acc) ->
Acc;
aggre([], true, Acc) ->
lists:usort(Acc).
%% @doc Forward message to another node.
-spec forward(node(), emqx_types:topic(), emqx_types:delivery(), RpcMode :: sync | async) ->

View File

@ -243,8 +243,8 @@ handle_call(Req, _From, State) ->
handle_cast({delete_routes, SessionID, Subscriptions}, State) ->
%% TODO: Make a batch for deleting all routes.
Fun = fun({Topic, _}) -> do_delete_route(Topic, SessionID) end,
ok = lists:foreach(Fun, maps:to_list(Subscriptions)),
Fun = fun(Topic, _) -> do_delete_route(Topic, SessionID) end,
ok = maps:foreach(Fun, Subscriptions),
{noreply, State};
handle_cast({resume_end, SessionID, Pid}, State) ->
case emqx_utils_ets:lookup_value(?SESSION_INIT_TAB, SessionID) of