on master help sign in
Fix four bugs: SendMessage mailbox full, evicted acks retry, RecvGossip trust check expiry
fa38fa7iko
server.knot+18−10
@@ -741,6 +741,7 @@ serve = \req -> case req of
741 let status = case session of
741 let status = case session of
742 Nothing {} -> "unauthorized"
742 Nothing {} -> "unauthorized"
743 _ -> if not validInput then "invalid"
743 _ -> if not validInput then "invalid"
744+ else if recipientMsgCount >= maxMessagesPerRecipient then "rejected"
744 else if localOnline then "delivered"
745 else if localOnline then "delivered"
745 else if count remoteServers > 0 then "federated"
746 else if count remoteServers > 0 then "federated"
746 else "queued"
747 else "queued"
@@ -751,15 +752,15 @@ serve = \req -> case req of
751 else forwards
752 else forwards
752 yield {status: status, remoteServers: remoteServers, fromKey: fromKey, expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, forwardsAtCapacity: forwardsAtCapacity}
753 yield {status: status, remoteServers: remoteServers, fromKey: fromKey, expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, forwardsAtCapacity: forwardsAtCapacity}
753 let finalStatus = if result.status == "federated" && (federationSecret == "" || result.forwardsAtCapacity) then "queued" else result.status
754 let finalStatus = if result.status == "federated" && (federationSecret == "" || result.forwardsAtCapacity) then "queued" else result.status
754− respond {status: finalStatus, messageId: (if result.status == "unauthorized" then "" else if result.status == "invalid" then "" else msgId)}
755+ respond {status: finalStatus, messageId: (if result.status == "unauthorized" then "" else if result.status == "invalid" then "" else if result.status == "rejected" then "" else msgId)}
755− if count result.remoteServers > 0 && not (result.status == "unauthorized") && not (result.status == "invalid") && not (federationSecret == "")
756+ if count result.remoteServers > 0 && not (result.status == "unauthorized") && not (result.status == "invalid") && not (result.status == "rejected") && not (federationSecret == "")
756 then sendToEach result.remoteServers (\server ->
757 then sendToEach result.remoteServers (\server ->
757 fetch (federationScheme ++ server) (ForwardMessage {
758 fetch (federationScheme ++ server) (ForwardMessage {
758 toKey: to, fromKey: result.fromKey, encryptedBlob: encryptedBlob,
759 toKey: to, fromKey: result.fromKey, encryptedBlob: encryptedBlob,
759 timestamp: clampedTs, originServer: serverHostN, messageId: msgId,
760 timestamp: clampedTs, originServer: serverHostN, messageId: msgId,
760 authorization: "Bearer " ++ federationSecret}))
761 authorization: "Bearer " ++ federationSecret}))
761 else yield {}
762 else yield {}
762− if result.forwardsAtCapacity && count result.remoteServers > 0 && not (result.status == "unauthorized") && not (result.status == "invalid")
763+ if result.forwardsAtCapacity && count result.remoteServers > 0 && not (result.status == "unauthorized") && not (result.status == "invalid") && not (result.status == "rejected")
763 then println ("sendMessage: forwards at capacity (" ++ show maxForwardsEntries ++ "), skipping forward tracking")
764 then println ("sendMessage: forwards at capacity (" ++ show maxForwardsEntries ++ "), skipping forward tracking")
764 else yield {}
765 else yield {}
765 broadcastOfflineGossip t result.peerServers result.expiredLocal
766 broadcastOfflineGossip t result.peerServers result.expiredLocal
@@ -830,10 +831,17 @@ serve = \req -> case req of
830 if count (do s <- acc; where s == a.originServer; yield s) > 0 then acc
831 if count (do s <- acc; where s == a.originServer; yield s) > 0 then acc
831 else union acc [a.originServer]) [] result.evictedEntries
832 else union acc [a.originServer]) [] result.evictedEntries
832 sendToEach evictedOriginServers (\server ->
833 sendToEach evictedOriginServers (\server ->
834+ catch (do
833− fetch (federationScheme ++ server) (FederationAck {
835+ fetch (federationScheme ++ server) (FederationAck {
834− authorization: "Bearer " ++ federationSecret,
836+ authorization: "Bearer " ++ federationSecret,
835− messageIds: (do a <- result.evictedEntries; where a.originServer == server; yield a.messageId),
837+ messageIds: (do a <- result.evictedEntries; where a.originServer == server; yield a.messageId),
836− originServer: server, fromServer: serverHostN}))
838+ originServer: server, fromServer: serverHostN})
839+ yield {}) (\err -> do
840+ println ("federation: error sending evicted ack to " ++ server ++ ": " ++ show err)
841+ atomic do
842+ ackedIds <- *ackedIds
843+ let reinsert = do a <- result.evictedEntries; where a.originServer == server; yield a
844+ set *ackedIds = union ackedIds reinsert))
837 else yield {}
845 else yield {}
838 broadcastOfflineGossip t result.peerServers result.expiredLocal
846 broadcastOfflineGossip t result.peerServers result.expiredLocal
839
847
@@ -936,14 +944,14 @@ serve = \req -> case req of
936 gossipResult <- atomic do
944 gossipResult <- atomic do
937 pr <- maybePrune t
945 pr <- maybePrune t
938 presence <- *presence
946 presence <- *presence
939− let fromServerTrusted = count (do p <- presence; where p.server == fromServer; yield p) > 0
947+ let fromServerTrusted = count (do p <- presence; where p.server == fromServer; where p.expiresAt > t; yield p) > 0
940 let trustedDeduped = do
948 let trustedDeduped = do
941 e <- deduped
949 e <- deduped
942− where e.server == fromServer || fromServerTrusted || count (do p <- presence; where p.server == e.server; yield p) > 0
950+ where e.server == fromServer || fromServerTrusted || count (do p <- presence; where p.server == e.server; where p.expiresAt > t; yield p) > 0
943 yield e
951 yield e
944 let trustedOffline = do
952 let trustedOffline = do
945 e <- offlineEntries
953 e <- offlineEntries
946− where e.server == fromServer || fromServerTrusted || count (do p <- presence; where p.server == e.server; yield p) > 0
954+ where e.server == fromServer || fromServerTrusted || count (do p <- presence; where p.server == e.server; where p.expiresAt > t; yield p) > 0
947 yield e
955 yield e
948 let appliedOnline = do
956 let appliedOnline = do
949 e <- trustedDeduped
957 e <- trustedDeduped