@@ -320,7 +320,7 @@ isBadServerName = \s ->
320320lookupSession = \sessions token t ->
321321 single (do
322322 s <- sessions
323− where s.token == token
323+ where safeCompare s.token token
324324 where s.expiresAt > t
325325 yield s)
326326
@@ -859,11 +859,16 @@ serve = \req -> case req of
859859 yield {messageId: m.messageId, toKey: m.toKey, ackedAt: t, originServer: m.originServer}
860860 ackedIds <- *ackedIds
861861 let combinedAckedIds = union ackedIds ackedFederated
862− set *ackedIds = combinedAckedIds
862+ let excessCount = count combinedAckedIds - maxAckedIds
863+ let afterEviction = if excessCount <= 0 then combinedAckedIds
864+ else evictOldestAckedIds combinedAckedIds excessCount
865+ let evictedEntries = if excessCount <= 0 then []
866+ else diff combinedAckedIds afterEviction
867+ set *ackedIds = afterEviction
863868 let ok = case session of
864869 Nothing {} -> False {}
865870 _ -> True {}
866− yield {ok: ok, ackedMessages: ackedMessages, expiredLocal: pr.expiredLocal, peerServers: pr.peerServers}
871+ yield {ok: ok, ackedMessages: ackedMessages, expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, evictedEntries: evictedEntries}
867872 let fedMessages = do
868873 m <- result.ackedMessages
869874 where not (m.originServer == "")
@@ -882,18 +887,8 @@ serve = \req -> case req of
882887 else yield {}
883888 if result.ok
884889 then do
885− evictedEntries <- atomic do
886− ackedIds <- *ackedIds
887− let excessCount = count ackedIds - maxAckedIds
888− if excessCount <= 0
889− then yield []
890− else do
891− let afterEviction = evictOldestAckedIds ackedIds excessCount
892− let evicted = diff ackedIds afterEviction
893− set *ackedIds = afterEviction
894− yield evicted
895890 let evictedToRetry = do
896− a <- evictedEntries
891+ a <- result.evictedEntries
897892 where count (do m <- fedMessages; where m.messageId == a.messageId; where m.toKey == a.toKey; yield m) == 0
898893 yield a
899894 if count evictedToRetry > 0 && not (federationSecret == "")