diff options
author | Evgeny Khramtsov <ekhramtsov@process-one.net> | 2019-07-30 20:57:09 +0300 |
---|---|---|
committer | Evgeny Khramtsov <ekhramtsov@process-one.net> | 2019-07-30 20:57:09 +0300 |
commit | 3e4d7a98af8386cd287e7628b78e3f108a2d8386 (patch) | |
tree | 9b88438e379ecee20fb2fcfa1a070e504403c367 /src/ejabberd_sm.erl | |
parent | Remove dead code (diff) |
Implement read-repair for session pids
Diffstat (limited to 'src/ejabberd_sm.erl')
-rw-r--r-- | src/ejabberd_sm.erl | 22 |
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) -> |