diff --git a/apps/emqx/rebar.config b/apps/emqx/rebar.config index b64c2181e..d1419703c 100644 --- a/apps/emqx/rebar.config +++ b/apps/emqx/rebar.config @@ -27,7 +27,7 @@ {lc, {git, "https://github.com/emqx/lc.git", {tag, "0.3.2"}}}, {gproc, {git, "https://github.com/emqx/gproc", {tag, "0.9.0.1"}}}, {cowboy, {git, "https://github.com/emqx/cowboy", {tag, "2.9.2"}}}, - {esockd, {git, "https://github.com/emqx/esockd", {tag, "5.9.6"}}}, + {esockd, {git, "https://github.com/emqx/esockd", {tag, "5.9.7"}}}, {ekka, {git, "https://github.com/emqx/ekka", {tag, "0.15.13"}}}, {gen_rpc, {git, "https://github.com/emqx/gen_rpc", {tag, "2.8.1"}}}, {hocon, {git, "https://github.com/emqx/hocon.git", {tag, "0.39.16"}}}, 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}), diff --git a/changes/ce/fix-11623.en.md b/changes/ce/fix-11623.en.md new file mode 100644 index 000000000..318e7f799 --- /dev/null +++ b/changes/ce/fix-11623.en.md @@ -0,0 +1,8 @@ +Upgrade library `esockd` from 5.9.6 to 5.9.7 + +This upgrade included +* Enhancements regarding proxy protocol error and timeout. [esockd pr#178](https://github.com/emqx/esockd/pull/178) +* Lowered `ssl_error` exceptions to info level logging. [esockd pr#180](https://github.com/emqx/esockd/pull/180) +* Malformed MQTT packet parsing exception log level is lowered from `error` to `info`. +* In command `emqx ctl listeners` output, the `shutdown_count` counter is incremented + when TLS handshake failure (`ssl_error`) or Malformed packet (`frame_error`) happens. diff --git a/mix.exs b/mix.exs index 68365f44c..1cb296ed3 100644 --- a/mix.exs +++ b/mix.exs @@ -53,7 +53,7 @@ defmodule EMQXUmbrella.MixProject do {:gproc, github: "emqx/gproc", tag: "0.9.0.1", override: true}, {:jiffy, github: "emqx/jiffy", tag: "1.0.5", override: true}, {:cowboy, github: "emqx/cowboy", tag: "2.9.2", override: true}, - {:esockd, github: "emqx/esockd", tag: "5.9.6", override: true}, + {:esockd, github: "emqx/esockd", tag: "5.9.7", override: true}, {:rocksdb, github: "emqx/erlang-rocksdb", tag: "1.8.0-emqx-1", override: true}, {:ekka, github: "emqx/ekka", tag: "0.15.13", override: true}, {:gen_rpc, github: "emqx/gen_rpc", tag: "2.8.1", override: true}, diff --git a/rebar.config b/rebar.config index 935c5be03..b79bc2461 100644 --- a/rebar.config +++ b/rebar.config @@ -60,7 +60,7 @@ , {gproc, {git, "https://github.com/emqx/gproc", {tag, "0.9.0.1"}}} , {jiffy, {git, "https://github.com/emqx/jiffy", {tag, "1.0.5"}}} , {cowboy, {git, "https://github.com/emqx/cowboy", {tag, "2.9.2"}}} - , {esockd, {git, "https://github.com/emqx/esockd", {tag, "5.9.6"}}} + , {esockd, {git, "https://github.com/emqx/esockd", {tag, "5.9.7"}}} , {rocksdb, {git, "https://github.com/emqx/erlang-rocksdb", {tag, "1.8.0-emqx-1"}}} , {ekka, {git, "https://github.com/emqx/ekka", {tag, "0.15.13"}}} , {gen_rpc, {git, "https://github.com/emqx/gen_rpc", {tag, "2.8.1"}}}