@@ -560,10 +560,9 @@ sendAcksAndClean = \pendingAcks servers ->
561 atomic do
561 atomic do
562 ackedIds <- *ackedIds
562 ackedIds <- *ackedIds
563− let ackMsgIds = do a <- serverAcks; yield a.messageId
564 set *ackedIds = do
563 set *ackedIds = do
565 a <- ackedIds
564 a <- ackedIds
566− where not (a.originServer == server && count (do mid <- ackMsgIds; where mid == a.messageId; yield mid) > 0)
565+ where not (a.originServer == server && count (do sa <- serverAcks; where sa.messageId == a.messageId; where sa.toKey == a.toKey; yield sa) > 0)
568 Err _ -> yield {}
567 Err _ -> yield {}
569 sendAcksAndClean pendingAcks rest
568 sendAcksAndClean pendingAcks rest
@@ -950,15 +949,19 @@ serve = \req -> case req of
950 messageIds: (do a <- evictedToRetry; where a.originServer == server; yield a.messageId),
949 messageIds: (do a <- evictedToRetry; where a.originServer == server; yield a.messageId),
951 originServer: server, fromServer: serverHostN})
950 originServer: server, fromServer: serverHostN})
952 case result of
951 case result of
953− Err _ -> atomic do
953+ dropped <- atomic do
954− ackedIds <- *ackedIds
954+ ackedIds <- *ackedIds
955− let reinsert = do a <- evictedToRetry; where a.originServer == server; yield a
955+ let reinsert = do a <- evictedToRetry; where a.originServer == server; yield a
956− let combined = union ackedIds reinsert
956+ let combined = union ackedIds reinsert
957− let excess = count combined - maxAckedIds
957+ let excess = count combined - maxAckedIds
958− let afterEviction = if excess <= 0 then combined
958+ let afterEviction = if excess <= 0 then combined
959− else evictOldestAckedIds combined excess
959+ else evictOldestAckedIds combined excess
960− set *ackedIds = afterEviction
960+ set *ackedIds = afterEviction
963+ then println ("ackMessages: ackedIds at capacity (" ++ show maxAckedIds ++ "), " ++ show dropped ++ " ack entries permanently lost for " ++ server)
961− yield {}
964+ else yield {}
962 _ -> yield {}
965 _ -> yield {}
964 else yield {}
967 else yield {}
@@ -1068,7 +1071,7 @@ serve = \req -> case req of
1069 let trustedOffline = do
1072 let trustedOffline = do
1070 e <- offlineEntries
1073 e <- offlineEntries
1071− where e.server == fromServer || count (do p <- presence; where p.server == e.server; where p.expiresAt > t; yield p) > 0
1074+ where e.server == fromServer
1073 let appliedOnline = do
1076 let appliedOnline = do
1074 e <- trustedDeduped
1077 e <- trustedDeduped