on master help sign in
Fix 3 bugs: ack cleanup should match toKey, add warning for lost acks under capacity, restrict offline gossip to authoritative server only
commit40ea04c3aca77b2cd9e478291deef8a79f28b252 authoriko <mail@iko.soy> dateWed 8 Apr 2026, 12:19 (6 months ago) parent478c21a
1 file changed+15−12
server.knot+15−12
server.knot+15−12
@@ -560,10 +560,9 @@ sendAcksAndClean = \pendingAcks servers ->
560560 Ok _ ->
561561 atomic do
562562 ackedIds <- *ackedIds
563− let ackMsgIds = do a <- serverAcks; yield a.messageId
564563 set *ackedIds = do
565564 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)
567566 yield a
568567 Err _ -> yield {}
569568 sendAcksAndClean pendingAcks rest
@@ -950,15 +949,19 @@ serve = \req -> case req of
950949 messageIds: (do a <- evictedToRetry; where a.originServer == server; yield a.messageId),
951950 originServer: server, fromServer: serverHostN})
952951 case result of
953− Err _ -> atomic do
954− ackedIds <- *ackedIds
955− let reinsert = do a <- evictedToRetry; where a.originServer == server; yield a
956− let combined = union ackedIds reinsert
957− let excess = count combined - maxAckedIds
958− let afterEviction = if excess <= 0 then combined
959− else evictOldestAckedIds combined excess
960− set *ackedIds = afterEviction
961− yield {}
952+ Err _ -> do
953+ dropped <- atomic do
954+ ackedIds <- *ackedIds
955+ let reinsert = do a <- evictedToRetry; where a.originServer == server; yield a
956+ let combined = union ackedIds reinsert
957+ let excess = count combined - maxAckedIds
958+ let afterEviction = if excess <= 0 then combined
959+ else evictOldestAckedIds combined excess
960+ set *ackedIds = afterEviction
961+ yield excess
962+ if dropped > 0
963+ then println ("ackMessages: ackedIds at capacity (" ++ show maxAckedIds ++ "), " ++ show dropped ++ " ack entries permanently lost for " ++ server)
964+ else yield {}
962965 _ -> yield {}
963966 )
964967 else yield {}
@@ -1068,7 +1071,7 @@ serve = \req -> case req of
10681071 yield e
10691072 let trustedOffline = do
10701073 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
10721075 yield e
10731076 let appliedOnline = do
10741077 e <- trustedDeduped