]> granicus.if.org Git - ejabberd/commitdiff
Implement read-repair for session pids
authorEvgeny Khramtsov <ekhramtsov@process-one.net>
Tue, 30 Jul 2019 17:57:09 +0000 (20:57 +0300)
committerEvgeny Khramtsov <ekhramtsov@process-one.net>
Tue, 30 Jul 2019 17:57:09 +0000 (20:57 +0300)
src/ejabberd_sm.erl

index 9e5c7e08c0636cd28add0ce3179a5fd3d7cf74bd..27bda401dc2c166b087a6056bb9dbd27662a70ff 100644 (file)
@@ -584,11 +584,11 @@ set_session(#session{us = {LUser, LServer}} = Session) ->
 
 -spec get_sessions(module()) -> [#session{}].
 get_sessions(Mod) ->
-    Mod:get_sessions().
+    delete_dead(Mod, Mod:get_sessions()).
 
 -spec get_sessions(module(), binary()) -> [#session{}].
 get_sessions(Mod, LServer) ->
-    Mod:get_sessions(LServer).
+    delete_dead(Mod, Mod:get_sessions(LServer)).
 
 -spec get_sessions(module(), binary(), binary()) -> [#session{}].
 get_sessions(Mod, LUser, LServer) ->
@@ -605,13 +605,13 @@ get_sessions(Mod, LUser, LServer) ->
                           end
                   end) of
                {ok, Sessions} ->
-                   Sessions;
+                   delete_dead(Mod, Sessions);
                error ->
                    []
            end;
        false ->
            case Mod:get_sessions(LUser, LServer) of
-               {ok, Ss} -> Ss;
+               {ok, Ss} -> delete_dead(Mod, Ss);
                _ -> []
            end
     end.
@@ -632,6 +632,20 @@ delete_session(Mod, #session{usr = {LUser, LServer, _}} = Session) ->
            ok
     end.
 
+-spec delete_dead(module(), [#session{}]) -> [#session{}].
+delete_dead(Mod, Sessions) ->
+    lists:filter(
+      fun(#session{sid = {_, Pid}} = Session) when node(Pid) == node() ->
+             case is_process_alive(Pid) of
+                 true -> true;
+                 false ->
+                     delete_session(Mod, Session),
+                     false
+             end;
+        (_) ->
+             true
+      end, Sessions).
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 -spec do_route(jid(), term()) -> any().
 do_route(#jid{lresource = <<"">>} = To, Term) ->