Fix session termiated without ws_channel

This commit is contained in:
terry-xiaoyu 2019-07-20 14:14:28 +08:00 committed by turtleDeng
parent 0c54d899da
commit 721e7c4804
3 changed files with 12 additions and 13 deletions

View File

@ -371,7 +371,9 @@ handle(info, Info = {'EXIT', SessionPid, Reason}, State = #state{proto_state = P
undefined -> undefined ->
?LOG(error, "Unexpected EXIT: ~p", [Info]), ?LOG(error, "Unexpected EXIT: ~p", [Info]),
{keep_state, State}; {keep_state, State};
SessionPid -> shutdown(Reason, State) SessionPid ->
?LOG(error, "Session ~p termiated: ~p", [SessionPid, Reason]),
shutdown(Reason, State)
end; end;
handle(info, Info, State) -> handle(info, Info, State) ->
@ -508,6 +510,8 @@ maybe_gc(_, State) -> State.
reply(From, Reply, State) -> reply(From, Reply, State) ->
{keep_state, State, [{reply, From, Reply}]}. {keep_state, State, [{reply, From, Reply}]}.
shutdown(Reason = {shutdown, _}, State) ->
stop(Reason, State);
shutdown(Reason, State) -> shutdown(Reason, State) ->
stop({shutdown, Reason}, State). stop({shutdown, Reason}, State).

View File

@ -652,23 +652,13 @@ handle_info(Info, State) ->
terminate(Reason, #state{will_msg = WillMsg, terminate(Reason, #state{will_msg = WillMsg,
client_id = ClientId, client_id = ClientId,
username = Username, username = Username}) ->
conn_pid = ConnPid,
old_conn_pid = OldConnPid}) ->
send_willmsg(WillMsg), send_willmsg(WillMsg),
[maybe_shutdown(Pid, Reason) || Pid <- [ConnPid, OldConnPid]],
ok = emqx_hooks:run('session.terminated', [#{client_id => ClientId, username => Username}, Reason]). ok = emqx_hooks:run('session.terminated', [#{client_id => ClientId, username => Username}, Reason]).
code_change(_OldVsn, State, _Extra) -> code_change(_OldVsn, State, _Extra) ->
{ok, State}. {ok, State}.
maybe_shutdown(undefined, _Reason) ->
ok;
maybe_shutdown(Pid, normal) ->
Pid ! {shutdown, normal};
maybe_shutdown(Pid, Reason) ->
exit(Pid, Reason).
%%------------------------------------------------------------------------------ %%------------------------------------------------------------------------------
%% Internal functions %% Internal functions
%%------------------------------------------------------------------------------ %%------------------------------------------------------------------------------

View File

@ -304,7 +304,9 @@ websocket_info(Info = {'EXIT', SessionPid, Reason}, State = #state{proto_state =
undefined -> undefined ->
?LOG(error, "Unexpected EXIT: ~p", [Info]), ?LOG(error, "Unexpected EXIT: ~p", [Info]),
{ok, State}; {ok, State};
SessionPid -> shutdown(Reason, State) SessionPid ->
?LOG(error, "Session ~p termiated: ~p", [SessionPid, Reason]),
shutdown(Reason, State)
end; end;
websocket_info(Info, State) -> websocket_info(Info, State) ->
@ -360,6 +362,9 @@ ensure_stats_timer(State = #state{enable_stats = true,
ensure_stats_timer(State) -> ensure_stats_timer(State) ->
State. State.
shutdown(Reason = {shutdown, _}, State) ->
self() ! {stop, Reason},
{ok, State};
shutdown(Reason, State) -> shutdown(Reason, State) ->
%% Fix the issue#2591(https://github.com/emqx/emqx/issues/2591#issuecomment-500278696) %% Fix the issue#2591(https://github.com/emqx/emqx/issues/2591#issuecomment-500278696)
self() ! {stop, {shutdown, Reason}}, self() ! {stop, {shutdown, Reason}},