]> granicus.if.org Git - ejabberd/commitdiff
ejabberd_sm: Clean up old offline session entries
authorHolger Weiss <holger@zedat.fu-berlin.de>
Sun, 2 Oct 2016 20:01:03 +0000 (22:01 +0200)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Sun, 2 Oct 2016 20:01:03 +0000 (22:01 +0200)
If the number of offline sessions exceeds the 'max_user_sessions' limit,
remove the oldest entry from the table.

src/ejabberd_sm.erl

index 16e0f9114fb577abb1a826403ba48811425d8616..3369b7ca0ba2cbfbc21b750d4aaf863bfacf542b 100644 (file)
@@ -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