fix(channel): send DISCONNECT packet if connection has been kicked

fix #7241
This commit is contained in:
JianBo He 2022-03-15 11:55:47 +08:00
parent bce4ca2fbd
commit 8d3e953eef
2 changed files with 21 additions and 2 deletions

View File

@ -926,7 +926,13 @@ return_sub_unsub_ack(Packet, Channel) ->
| {shutdown, Reason :: term(), Reply :: term(), emqx_types:packet(), channel()}). | {shutdown, Reason :: term(), Reply :: term(), emqx_types:packet(), channel()}).
handle_call(kick, Channel) -> handle_call(kick, Channel) ->
Channel1 = ensure_disconnected(kicked, Channel), Channel1 = ensure_disconnected(kicked, Channel),
disconnect_and_shutdown(kicked, ok, Channel1); case Channel1 of
?IS_MQTT_V5 ->
shutdown(kicked, ok,
?DISCONNECT_PACKET(?RC_ADMINISTRATIVE_ACTION), Channel1);
_ ->
shutdown(kicked, ok, Channel1)
end;
handle_call(discard, Channel) -> handle_call(discard, Channel) ->
disconnect_and_shutdown(discarded, ok, Channel); disconnect_and_shutdown(discarded, ok, Channel);

View File

@ -577,7 +577,12 @@ t_handle_out_unexpected(_) ->
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
t_handle_call_kick(_) -> t_handle_call_kick(_) ->
{shutdown, kicked, ok, _Chan} = emqx_channel:handle_call(kick, channel()). Channelv5 = channel(),
Channelv4 = v4(Channelv5),
{shutdown, kicked, ok, _} = emqx_channel:handle_call(kick, Channelv4),
{shutdown, kicked, ok,
?DISCONNECT_PACKET(?RC_ADMINISTRATIVE_ACTION),
_} = emqx_channel:handle_call(kick, Channelv5).
t_handle_call_discard(_) -> t_handle_call_discard(_) ->
Packet = ?DISCONNECT_PACKET(?RC_SESSION_TAKEN_OVER), Packet = ?DISCONNECT_PACKET(?RC_SESSION_TAKEN_OVER),
@ -858,3 +863,11 @@ session(InitFields) when is_map(InitFields) ->
quota() -> quota() ->
emqx_limiter:init(zone, [{conn_messages_routing, {5, 1}}, emqx_limiter:init(zone, [{conn_messages_routing, {5, 1}},
{overall_messages_routing, {10, 1}}]). {overall_messages_routing, {10, 1}}]).
v4(Channel) ->
ConnInfo = emqx_channel:info(conninfo, Channel),
emqx_channel:set_field(
conninfo,
maps:put(proto_ver, ?MQTT_PROTO_V4, ConnInfo),
Channel
).