aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2016-10-02 22:01:03 +0200
committerHolger Weiss <holger@zedat.fu-berlin.de>2016-10-02 22:01:03 +0200
commit9cee3760db4f304d8354c33b641b84f5423e1a80 (patch)
tree92e2df472ddb13d796d9186950fade34cdfefc88 /src
parentPubSub: creation jid must be bare jid (diff)
ejabberd_sm: Clean up old offline session entries
If the number of offline sessions exceeds the 'max_user_sessions' limit, remove the oldest entry from the table.
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_sm.erl14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl
index 16e0f9114..3369b7ca0 100644
--- a/src/ejabberd_sm.erl
+++ b/src/ejabberd_sm.erl
@@ -713,10 +713,18 @@ get_resource_sessions(User, Server, Resource) ->
check_max_sessions(LUser, LServer) ->
Mod = get_sm_backend(LServer),
- SIDs = [S#session.sid || S <- online(Mod:get_sessions(LUser, LServer))],
+ Ss = Mod:get_sessions(LUser, LServer),
+ {OnlineSs, OfflineSs} = lists:partition(fun is_online/1, Ss),
MaxSessions = get_max_user_sessions(LUser, LServer),
- if length(SIDs) =< MaxSessions -> ok;
- true -> {_, Pid} = lists:min(SIDs), Pid ! replaced
+ if length(OnlineSs) =< MaxSessions -> ok;
+ true ->
+ #session{sid = {_, Pid}} = lists:min(OnlineSs),
+ Pid ! replaced
+ end,
+ if length(OfflineSs) =< MaxSessions -> ok;
+ true ->
+ #session{sid = SID, usr = {_, _, R}} = lists:min(OfflineSs),
+ Mod:delete_session(LUser, LServer, R, SID)
end.
%% Get the user_max_session setting