diff --git a/src/emqx_channel.erl b/src/emqx_channel.erl index 0aeedcdfa..5aaa62b30 100644 --- a/src/emqx_channel.erl +++ b/src/emqx_channel.erl @@ -371,7 +371,9 @@ handle(info, Info = {'EXIT', SessionPid, Reason}, State = #state{proto_state = P undefined -> ?LOG(error, "Unexpected EXIT: ~p", [Info]), {keep_state, State}; - SessionPid -> shutdown(Reason, State) + SessionPid -> + ?LOG(error, "Session ~p termiated: ~p", [SessionPid, Reason]), + shutdown(Reason, State) end; handle(info, Info, State) -> @@ -508,6 +510,8 @@ maybe_gc(_, State) -> State. reply(From, Reply, State) -> {keep_state, State, [{reply, From, Reply}]}. +shutdown(Reason = {shutdown, _}, State) -> + stop(Reason, State); shutdown(Reason, State) -> stop({shutdown, Reason}, State). diff --git a/src/emqx_session.erl b/src/emqx_session.erl index 20028c9ef..7d23c9e62 100644 --- a/src/emqx_session.erl +++ b/src/emqx_session.erl @@ -652,23 +652,13 @@ handle_info(Info, State) -> terminate(Reason, #state{will_msg = WillMsg, client_id = ClientId, - username = Username, - conn_pid = ConnPid, - old_conn_pid = OldConnPid}) -> + username = Username}) -> send_willmsg(WillMsg), - [maybe_shutdown(Pid, Reason) || Pid <- [ConnPid, OldConnPid]], ok = emqx_hooks:run('session.terminated', [#{client_id => ClientId, username => Username}, Reason]). code_change(_OldVsn, State, _Extra) -> {ok, State}. -maybe_shutdown(undefined, _Reason) -> - ok; -maybe_shutdown(Pid, normal) -> - Pid ! {shutdown, normal}; -maybe_shutdown(Pid, Reason) -> - exit(Pid, Reason). - %%------------------------------------------------------------------------------ %% Internal functions %%------------------------------------------------------------------------------ diff --git a/src/emqx_ws_channel.erl b/src/emqx_ws_channel.erl index c308b687e..23a4d8d4c 100644 --- a/src/emqx_ws_channel.erl +++ b/src/emqx_ws_channel.erl @@ -304,7 +304,9 @@ websocket_info(Info = {'EXIT', SessionPid, Reason}, State = #state{proto_state = undefined -> ?LOG(error, "Unexpected EXIT: ~p", [Info]), {ok, State}; - SessionPid -> shutdown(Reason, State) + SessionPid -> + ?LOG(error, "Session ~p termiated: ~p", [SessionPid, Reason]), + shutdown(Reason, State) end; websocket_info(Info, State) -> @@ -360,6 +362,9 @@ ensure_stats_timer(State = #state{enable_stats = true, ensure_stats_timer(State) -> State. +shutdown(Reason = {shutdown, _}, State) -> + self() ! {stop, Reason}, + {ok, State}; shutdown(Reason, State) -> %% Fix the issue#2591(https://github.com/emqx/emqx/issues/2591#issuecomment-500278696) self() ! {stop, {shutdown, Reason}},