aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_sm.erl
diff options
context:
space:
mode:
authorEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-30 20:57:09 +0300
committerEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-30 20:57:09 +0300
commit3e4d7a98af8386cd287e7628b78e3f108a2d8386 (patch)
tree9b88438e379ecee20fb2fcfa1a070e504403c367 /src/ejabberd_sm.erl
parentRemove dead code (diff)
Implement read-repair for session pids
Diffstat (limited to 'src/ejabberd_sm.erl')
-rw-r--r--src/ejabberd_sm.erl22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl
index 9e5c7e08c..27bda401d 100644
--- a/src/ejabberd_sm.erl
+++ b/src/ejabberd_sm.erl
@@ -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) ->