From 6e1a55e9eda0d732b1427acb16ccc76dc1410c91 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Mon, 29 Mar 2021 11:14:57 +0200 Subject: [PATCH] perf(emqx_connection): no priority receive Prior to this change the main message receive loop of emqx_connection is a priority receive which selects system messages and parent EXIT signals prior to other message. This accidental (not intended) design may cause the receive operation to scan potentially large mail box. --- src/emqx_connection.erl | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/emqx_connection.erl b/src/emqx_connection.erl index 28ea67bf8..92778f7a8 100644 --- a/src/emqx_connection.erl +++ b/src/emqx_connection.erl @@ -269,17 +269,20 @@ exit_on_sock_error(Reason) -> recvloop(Parent, State = #state{idle_timeout = IdleTimeout}) -> receive - {system, From, Request} -> - sys:handle_system_msg(Request, From, Parent, ?MODULE, [], State); - {'EXIT', Parent, Reason} -> - terminate(Reason, State); Msg -> - process_msg([Msg], Parent, ensure_stats_timer(IdleTimeout, State)) + handle_recv(Msg, Parent, State) after IdleTimeout + 100 -> hibernate(Parent, cancel_stats_timer(State)) end. +handle_recv({system, From, Request}, Parent, State) -> + sys:handle_system_msg(Request, From, Parent, ?MODULE, [], State); +handle_recv({'EXIT', Parent, Reason}, Parent, State) -> + terminate(Reason, State); +handle_recv(Msg, Parent, State = #state{idle_timeout = IdleTimeout}) -> + process_msg([Msg], Parent, ensure_stats_timer(IdleTimeout, State)). + hibernate(Parent, State) -> proc_lib:hibernate(?MODULE, wakeup_from_hib, [Parent, State]).