diff --git a/src/emqttd_sm.erl b/src/emqttd_sm.erl index e40bde20f..49db5be9c 100644 --- a/src/emqttd_sm.erl +++ b/src/emqttd_sm.erl @@ -246,8 +246,14 @@ resume_session(#mqtt_session{client_id = ClientId, sess_pid = SessPid}, ClientPid) when node(SessPid) =:= node() -> - emqttd_session:resume(SessPid, ClientId, ClientPid), - {ok, SessPid}; + case is_process_alive(SessPid) of + true -> + emqttd_session:resume(SessPid, ClientId, ClientPid), + {ok, SessPid}; + false -> + lager:error("Session(~s): Cannot resume ~p, it seems already dead!", [ClientId, SessPid]), + {error, session_died} + end; %% Remote node resume_session(Session = #mqtt_session{client_id = ClientId, sess_pid = SessPid}, ClientPid) -> diff --git a/src/emqttd_sm_helper.erl b/src/emqttd_sm_helper.erl index 4e953b8b2..a3387b6a3 100644 --- a/src/emqttd_sm_helper.erl +++ b/src/emqttd_sm_helper.erl @@ -69,14 +69,17 @@ handle_info({mnesia_system_event, {mnesia_down, Node}}, State) -> lager:error("!!!Mnesia node down: ~s", [Node]), Fun = fun() -> ClientIds = - mnesia:select(session, [{#mqtt_session{client_id = '$1', sess_pid = '$2'}, + mnesia:select(session, [{#mqtt_session{client_id = '$1', sess_pid = '$2', _ = '_'}, [{'==', {node, '$2'}, Node}], ['$1']}]), - lists:foreach(fun(ClientId) -> mnesia:delete({session, ClientId}) end, ClientIds) + lists:foreach(fun(ClientId) -> mnesia:delete({session, ClientId}) end, ClientIds) end, mnesia:async_dirty(Fun), {noreply, State}; +handle_info({mnesia_system_event, {mnesia_up, _Node}}, State) -> + {noreply, State}; + handle_info(tick, State) -> {noreply, setstats(State), hibernate};