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
40ea04ciko
server.knot+15−12
@@ -560,10 +560,9 @@ sendAcksAndClean = \pendingAcks servers ->
560 Ok _ ->
560 Ok _ ->
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)
567 yield a
566 yield a
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
952+ Err _ -> do
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
961+ yield excess
962+ if dropped > 0
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 {}
963 )
966 )
964 else yield {}
967 else yield {}
@@ -1068,7 +1071,7 @@ serve = \req -> case req of
1068 yield e
1071 yield e
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
1072 yield e
1075 yield e
1073 let appliedOnline = do
1076 let appliedOnline = do
1074 e <- trustedDeduped
1077 e <- trustedDeduped