on master help sign in
Introduce derived relations &pendingAcks and &knownMessageKeys for cleaner federation and dedup logic
064c373iko
server.knot+15−11
@@ -488,6 +488,17 @@ countMessagesFor = \messages toKey t ->
488 where m.receivedAt >= t - messageMaxAge
488 where m.receivedAt >= t - messageMaxAge
489 yield m)
489 yield m)
490
490
491+&pendingAcks = do
492+ ackedIds <- *ackedIds
493+ yield (do a <- ackedIds; where isFederatedOrigin a.originServer; yield a)
494+
495+&knownMessageKeys = do
496+ messages <- *messages
497+ ackedIds <- *ackedIds
498+ yield (union
499+ (do m <- messages; yield {messageId: m.messageId, toKey: m.toKey})
500+ (do a <- ackedIds; yield {messageId: a.messageId, toKey: a.toKey}))
501+
491validGossipEvents : [GossipEvent] -> Bool -> Timestamp -> GossipEventType -> [{pubkey: PubkeyHex, server: Text, expiresAt: Timestamp, timestamp: Timestamp, ttl: Int<S>}]
502validGossipEvents : [GossipEvent] -> Bool -> Timestamp -> GossipEventType -> [{pubkey: PubkeyHex, server: Text, expiresAt: Timestamp, timestamp: Timestamp, ttl: Int<S>}]
492validGossipEvents = \events validRequest t eventType ->
503validGossipEvents = \events validRequest t eventType ->
493 do
504 do
@@ -668,11 +679,7 @@ pruneAndRetry = \t -> do
668 let pendingForwards = do
679 let pendingForwards = do
669 f <- forwards
680 f <- forwards
670 yield {toServer: f.toServer, toKey: f.toKey, fromKey: f.fromKey, encryptedBlob: f.encryptedBlob, timestamp: f.timestamp, messageId: f.messageId}
681 yield {toServer: f.toServer, toKey: f.toKey, fromKey: f.fromKey, encryptedBlob: f.encryptedBlob, timestamp: f.timestamp, messageId: f.messageId}
671− ackedIds <- *ackedIds
672− let pendingAcks = do
682+ pendingAcks <- &pendingAcks
673− a <- ackedIds
674− where isFederatedOrigin a.originServer
675− yield a
676 yield {expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, pendingForwards: pendingForwards, pendingAcks: pendingAcks}
683 yield {expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, pendingForwards: pendingForwards, pendingAcks: pendingAcks}
677 broadcastOfflineGossip t result.peerServers result.expiredLocal
684 broadcastOfflineGossip t result.peerServers result.expiredLocal
678 if federationEnabled && count result.pendingForwards > 0
685 if federationEnabled && count result.pendingForwards > 0
@@ -1134,12 +1141,9 @@ serve = \req -> case req of
1134 let seqTs = nextSeqTs t seqCounter
1141 let seqTs = nextSeqTs t seqCounter
1135 let recipientMsgCount = if not (authorized && validOrigin) then 0
1142 let recipientMsgCount = if not (authorized && validOrigin) then 0
1136 else countMessagesFor messages toKey t
1143 else countMessagesFor messages toKey t
1137− let existsInMessages = if not (authorized && validOrigin) then False {}
1144+ knownKeys <- &knownMessageKeys
1138− else any messages (\m -> m.messageId == messageId && m.toKey == toKey)
1145+ let exists = if not (authorized && validOrigin) then False {}
1139− ackedIds <- *ackedIds
1146+ else any knownKeys (\k -> k.messageId == messageId && k.toKey == toKey)
1140− let existsInAcked = if not (authorized && validOrigin) then False {}
1141− else any ackedIds (\a -> a.messageId == messageId && a.toKey == toKey)
1142− let exists = existsInMessages || existsInAcked
1143 let shouldInsert = authorized && validOrigin && not exists && recipientMsgCount < maxMessagesPerRecipient
1147 let shouldInsert = authorized && validOrigin && not exists && recipientMsgCount < maxMessagesPerRecipient
1144 set *seqCounter = if shouldInsert then seqTs else seqCounter
1148 set *seqCounter = if shouldInsert then seqTs else seqCounter
1145 set *messages = if shouldInsert
1149 set *messages = if shouldInsert