Sfoglia il codice sorgente

fix issue #282 - emqttd_sm optimized

Feng Lee 10 anni fa
parent
commit
b59a8664eb
2 ha cambiato i file con 13 aggiunte e 4 eliminazioni
  1. 8 2
      src/emqttd_sm.erl
  2. 5 2
      src/emqttd_sm_helper.erl

+ 8 - 2
src/emqttd_sm.erl

@@ -246,8 +246,14 @@ resume_session(#mqtt_session{client_id = ClientId,
                              sess_pid  = SessPid}, ClientPid)
                              sess_pid  = SessPid}, ClientPid)
     when node(SessPid) =:= node() ->
     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
 %% Remote node
 resume_session(Session = #mqtt_session{client_id = ClientId, sess_pid = SessPid}, ClientPid) ->
 resume_session(Session = #mqtt_session{client_id = ClientId, sess_pid = SessPid}, ClientPid) ->

+ 5 - 2
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]),
     lager:error("!!!Mnesia node down: ~s", [Node]),
     Fun = fun() ->
     Fun = fun() ->
             ClientIds =
             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}],
                                     [{'==', {node, '$2'}, Node}],
                                     ['$1']}]),
                                     ['$1']}]),
-             lists:foreach(fun(ClientId) -> mnesia:delete({session, ClientId}) end, ClientIds)
+            lists:foreach(fun(ClientId) -> mnesia:delete({session, ClientId}) end, ClientIds)
           end,
           end,
     mnesia:async_dirty(Fun),
     mnesia:async_dirty(Fun),
     {noreply, State};
     {noreply, State};
 
 
+handle_info({mnesia_system_event, {mnesia_up, _Node}}, State) ->
+    {noreply, State};
+
 handle_info(tick, State) ->
 handle_info(tick, State) ->
     {noreply, setstats(State), hibernate};
     {noreply, setstats(State), hibernate};