This commit is contained in:
voidlizard 2024-10-13 09:50:49 +03:00
parent e6804415a8
commit 338f1f03c7
1 changed files with 44 additions and 14 deletions

View File

@ -96,12 +96,19 @@ deriving instance ForMailbox s => Eq (PolicyDownload s)
instance ForMailbox s => Hashable (PolicyDownload s) where instance ForMailbox s => Hashable (PolicyDownload s) where
hashWithSalt s p = hashWithSalt s (serialise p) hashWithSalt s p = hashWithSalt s (serialise p)
data MailboxDowload = data MailboxDownload s =
MailboxDowload MailboxDownload
{ mailboxDownWhen :: Word64 { mailboxRef :: MailboxRefKey s
, mailboxStatusRef :: HashRef
, mailboxDownWhen :: Word64
, mailboxDownPolicy :: Maybe PolicyVersion , mailboxDownPolicy :: Maybe PolicyVersion
, mailboxDownDone :: Bool
} }
deriving stock Generic deriving stock (Generic)
deriving stock instance ForMailbox s => Eq (MailboxDownload s)
instance ForMailbox s => Hashable (MailboxDownload s)
data MailboxProtoWorker (s :: CryptoScheme) e = data MailboxProtoWorker (s :: CryptoScheme) e =
MailboxProtoWorker MailboxProtoWorker
@ -113,7 +120,7 @@ data MailboxProtoWorker (s :: CryptoScheme) e =
, inMessageQueue :: TBQueue (Message s, MessageContent s) , inMessageQueue :: TBQueue (Message s, MessageContent s)
, inMessageMergeQueue :: TVar (HashMap (MailboxRefKey s) (HashSet HashRef)) , inMessageMergeQueue :: TVar (HashMap (MailboxRefKey s) (HashSet HashRef))
, inPolicyDownloadQ :: TVar (HashMap HashRef (PolicyDownload s)) , inPolicyDownloadQ :: TVar (HashMap HashRef (PolicyDownload s))
, inMailboxDownloadQ :: TVar (HashMap HashRef MailboxDowload) , inMailboxDownloadQ :: TVar (HashMap HashRef (MailboxDownload s))
, inMessageQueueInNum :: TVar Int , inMessageQueueInNum :: TVar Int
, inMessageQueueOutNum :: TVar Int , inMessageQueueOutNum :: TVar Int
, inMessageQueueDropped :: TVar Int , inMessageQueueDropped :: TVar Int
@ -280,7 +287,9 @@ instance ( s ~ Encryption e, e ~ L4Proto
let downloadStatus v = do let downloadStatus v = do
maybe1 mbsMailboxHash (okay ()) $ \h -> do maybe1 mbsMailboxHash (okay ()) $ \h -> do
startDownloadStuff me h startDownloadStuff me h
atomically $ modifyTVar inMailboxDownloadQ (HM.insert h (MailboxDowload now v)) -- one download per version per hash
let downKey = HashRef $ hashObject (serialise (v,h))
atomically $ modifyTVar inMailboxDownloadQ (HM.insert downKey (MailboxDownload ref h now v False))
okay () okay ()
case mbsMailboxPolicy of case mbsMailboxPolicy of
@ -426,6 +435,7 @@ mailboxProtoWorker :: forall e s m . ( MonadIO m
, IsRefPubKey s , IsRefPubKey s
, ForMailbox s , ForMailbox s
, m ~ PeerM e IO , m ~ PeerM e IO
, e ~ L4Proto
) )
=> m [Syntax C] => m [Syntax C]
-> MailboxProtoWorker s e -> MailboxProtoWorker s e
@ -558,7 +568,7 @@ mailboxProtoWorker readConf me@MailboxProtoWorker{..} = do
polling (Polling 30 30) policies $ \(pk,PolicyDownload{..}) -> do polling (Polling 30 30) policies $ \(pk,PolicyDownload{..}) -> do
missed <- findMissedBlocks mpwStorage pk <&> L.null missed <- findMissedBlocks mpwStorage pk <&> L.null
unless missed do unless missed $ flip runContT pure do
let mbox = MailboxRefKey (sppMailboxKey policyDownloadWhat) let mbox = MailboxRefKey (sppMailboxKey policyDownloadWhat)
current <- loadPolicyPayloadUnboxed @s dbe mpwStorage mbox current <- loadPolicyPayloadUnboxed @s dbe mpwStorage mbox
@ -567,16 +577,36 @@ mailboxProtoWorker readConf me@MailboxProtoWorker{..} = do
let downloaded = sppPolicyVersion policyDownloadWhat let downloaded = sppPolicyVersion policyDownloadWhat
mlbs <- getBlock mpwStorage (coerce pk)
lbs <- ContT $ maybe1 mlbs (err $ red "storage fail: missed block" <+> pretty pk)
let msp = deserialiseOrFail @(SignedBox (SetPolicyPayload s) s) lbs
& either (const Nothing) Just
spb <- ContT $ maybe1 msp (err $ red "storage fail: corrupted block" <+> pretty pk)
when (downloaded > current) do when (downloaded > current) do
-- set policy void $ mailboxSetPolicy me spb
pure ()
atomically $ modifyTVar inPolicyDownloadQ (HM.delete pk) atomically $ modifyTVar inPolicyDownloadQ (HM.delete pk)
stateDownloadQ = do stateDownloadQ = do
forever do
pause @'Seconds 10 let mail = readTVarIO inMailboxDownloadQ
debug $ red "mailbox: stateDownloadQ" <&> HM.toList
<&> fmap (,10)
polling (Polling 30 30) mail $ \(pk, down@MailboxDownload{..}) -> do
missed <- findMissedBlocks mpwStorage mailboxStatusRef <&> L.null
when (not missed && not mailboxDownDone) do
atomically $ modifyTVar inMailboxDownloadQ (HM.insert pk (down { mailboxDownDone = True }))
debug $ "mailbox state downloaded" <+> pretty pk
unless missed do
debug $ "mailbox/debug: drop state" <+> pretty pk <+> pretty mailboxStatusRef
atomically $ modifyTVar inMailboxDownloadQ (HM.delete pk)
mailboxFetchQ dbe = forever do mailboxFetchQ dbe = forever do
toFetch <- atomically $ do toFetch <- atomically $ do
@ -595,9 +625,9 @@ mailboxProtoWorker readConf me@MailboxProtoWorker{..} = do
mailboxCheckQ dbe = do mailboxCheckQ dbe = do
-- FIXME: mailbox-check-period -- FIXME: mailbox-check-period
-- right now it's 10 seconds for debug purposes -- right now it's 60 seconds for debug purposes
-- remove hardcode to smth reasonable -- remove hardcode to smth reasonable
let mboxes = liftIO (listMailboxes @s dbe <&> fmap (set _2 10) ) let mboxes = liftIO (listMailboxes @s dbe <&> fmap (set _2 60) )
polling (Polling 10 10) mboxes $ \r -> do polling (Polling 10 10) mboxes $ \r -> do
debug $ yellow "mailbox: SEND FETCH REQUEST FOR" <+> pretty r debug $ yellow "mailbox: SEND FETCH REQUEST FOR" <+> pretty r