Просмотр исходного кода

fix(emqx_channel): aovid logging frame errors as exceptions

Zaiming (Stone) Shi 2 лет назад
Родитель
Сommit
f66d9e76fe
2 измененных файлов с 14 добавлено и 5 удалено
  1. 12 3
      apps/emqx/src/emqx_channel.erl
  2. 2 2
      apps/emqx/test/emqx_channel_SUITE.erl

+ 12 - 3
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,

+ 2 - 2
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}),