From f66d9e76fe5d152914aafc1a1c6e40fb65dc89ec Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Sun, 17 Sep 2023 19:30:12 +0200 Subject: [PATCH] fix(emqx_channel): aovid logging frame errors as exceptions --- apps/emqx/src/emqx_channel.erl | 15 ++++++++++++--- apps/emqx/test/emqx_channel_SUITE.erl | 4 ++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/apps/emqx/src/emqx_channel.erl b/apps/emqx/src/emqx_channel.erl index 2b20ee709..0d83c60a6 100644 --- a/apps/emqx/src/emqx_channel.erl +++ b/apps/emqx/src/emqx_channel.erl @@ -564,11 +564,13 @@ handle_in( handle_in(?AUTH_PACKET(), Channel) -> handle_out(disconnect, ?RC_IMPLEMENTATION_SPECIFIC_ERROR, Channel); handle_in({frame_error, Reason}, Channel = #channel{conn_state = idle}) -> - shutdown(Reason, Channel); + shutdown(shutdown_count(frame_error, Reason), Channel); handle_in({frame_error, frame_too_large}, Channel = #channel{conn_state = connecting}) -> - shutdown(frame_too_large, ?CONNACK_PACKET(?RC_PACKET_TOO_LARGE), Channel); + shutdown( + shutdown_count(frame_error, frame_too_large), ?CONNACK_PACKET(?RC_PACKET_TOO_LARGE), Channel + ); handle_in({frame_error, Reason}, Channel = #channel{conn_state = connecting}) -> - shutdown(Reason, ?CONNACK_PACKET(?RC_MALFORMED_PACKET), Channel); + shutdown(shutdown_count(frame_error, Reason), ?CONNACK_PACKET(?RC_MALFORMED_PACKET), Channel); handle_in({frame_error, frame_too_large}, Channel = #channel{conn_state = ConnState}) when ConnState =:= connected orelse ConnState =:= reauthenticating -> @@ -2211,6 +2213,13 @@ shutdown(success, Reply, Packet, Channel) -> shutdown(Reason, Reply, Packet, Channel) -> {shutdown, Reason, Reply, Packet, Channel}. +%% process exits with {shutdown, #{shutdown_count := Kind}} will trigger +%% make the connection supervisor (esockd) keep a shutdown-counter groupd by Kind +shutdown_count(Kind, Reason) when is_map(Reason) -> + Reason#{shutdown_count => Kind}; +shutdown_count(Kind, Reason) -> + #{shutdown_count => Kind, reason => Reason}. + %% mqtt v5 connected sessions disconnect_and_shutdown( Reason, diff --git a/apps/emqx/test/emqx_channel_SUITE.erl b/apps/emqx/test/emqx_channel_SUITE.erl index 4f4311edc..6520d820a 100644 --- a/apps/emqx/test/emqx_channel_SUITE.erl +++ b/apps/emqx/test/emqx_channel_SUITE.erl @@ -436,11 +436,11 @@ t_handle_in_auth(_) -> t_handle_in_frame_error(_) -> IdleChannel = channel(#{conn_state => idle}), - {shutdown, frame_too_large, _Chan} = + {shutdown, #{shutdown_count := frame_error, reason := frame_too_large}, _Chan} = emqx_channel:handle_in({frame_error, frame_too_large}, IdleChannel), ConnectingChan = channel(#{conn_state => connecting}), ConnackPacket = ?CONNACK_PACKET(?RC_PACKET_TOO_LARGE), - {shutdown, frame_too_large, ConnackPacket, _} = + {shutdown, #{shutdown_count := frame_error, reason := frame_too_large}, ConnackPacket, _} = emqx_channel:handle_in({frame_error, frame_too_large}, ConnectingChan), DisconnectPacket = ?DISCONNECT_PACKET(?RC_PACKET_TOO_LARGE), ConnectedChan = channel(#{conn_state => connected}),