Ensure the 'conn_state' be 'disconnected' after socket closed

This commit is contained in:
Feng Lee 2019-10-12 19:14:33 +08:00
parent 7f730ffec6
commit 6233aa7d46
3 changed files with 9 additions and 7 deletions

View File

@ -737,9 +737,9 @@ handle_info({register, Attrs, Stats}, #channel{clientinfo = #{clientid := Client
handle_info({sock_closed, _Reason}, Channel = #channel{conn_state = disconnected}) -> handle_info({sock_closed, _Reason}, Channel = #channel{conn_state = disconnected}) ->
{ok, Channel}; {ok, Channel};
handle_info({sock_closed, _Reason}, Channel = #channel{conninfo = ConnInfo, handle_info({sock_closed, Reason}, Channel = #channel{conninfo = ConnInfo,
clientinfo = ClientInfo = #{zone := Zone}, clientinfo = ClientInfo = #{zone := Zone},
will_msg = WillMsg}) -> will_msg = WillMsg}) ->
emqx_zone:enable_flapping_detect(Zone) andalso emqx_flapping:detect(ClientInfo), emqx_zone:enable_flapping_detect(Zone) andalso emqx_flapping:detect(ClientInfo),
ConnInfo1 = ConnInfo#{disconnected_at => erlang:system_time(second)}, ConnInfo1 = ConnInfo#{disconnected_at => erlang:system_time(second)},
Channel1 = Channel#channel{conninfo = ConnInfo1, conn_state = disconnected}, Channel1 = Channel#channel{conninfo = ConnInfo1, conn_state = disconnected},
@ -750,11 +750,11 @@ handle_info({sock_closed, _Reason}, Channel = #channel{conninfo = ConnInfo,
end, end,
case maps:get(expiry_interval, ConnInfo) of case maps:get(expiry_interval, ConnInfo) of
?UINT_MAX -> ?UINT_MAX ->
{ok, Channel2}; {ok, {enter, disconnected}, Channel2};
Int when Int > 0 -> Int when Int > 0 ->
{ok, ensure_timer(expire_timer, Channel2)}; {ok, {enter, disconnected}, ensure_timer(expire_timer, Channel2)};
_Other -> _Other ->
shutdown(closed, Channel2) shutdown(Reason, Channel2)
end; end;
handle_info(Info, Channel) -> handle_info(Info, Channel) ->
@ -1206,3 +1206,4 @@ shutdown(Reason, Channel) ->
shutdown(Reason, Packets, Channel) -> shutdown(Reason, Packets, Channel) ->
{stop, {shutdown, Reason}, Packets, Channel}. {stop, {shutdown, Reason}, Packets, Channel}.

View File

@ -554,7 +554,7 @@ handle_info(sock_closed, State) ->
handle_info({close, Reason}, State) -> handle_info({close, Reason}, State) ->
?LOG(debug, "Force close due to : ~p", [Reason]), ?LOG(debug, "Force close due to : ~p", [Reason]),
{ok, close_socket(State)}; handle_info({sock_closed, Reason}, close_socket(State));
handle_info(Info, State = #state{channel = Channel}) -> handle_info(Info, State = #state{channel = Channel}) ->
handle_return(emqx_channel:handle_info(Info, Channel), State). handle_return(emqx_channel:handle_info(Info, Channel), State).

View File

@ -25,6 +25,7 @@
all() -> emqx_ct:all(?MODULE). all() -> emqx_ct:all(?MODULE).
init_per_suite(Config) -> init_per_suite(Config) ->
ok = emqx_logger:set_log_level(emergency),
Config. Config.
end_per_suite(_Config) -> end_per_suite(_Config) ->