25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-11-22 16:20:52 +01:00

Implement read-repair for session pids

This commit is contained in:
Evgeny Khramtsov 2019-07-30 20:57:09 +03:00
parent 46cc6c66ec
commit 3e4d7a98af

View 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) ->