@@ -43,7 +43,7 @@ import Data.Either (partitionEithers, rights)
4343import Data.Int (Int64 )
4444import Data.List (foldl' , partition , sortOn )
4545import qualified Data.List.NonEmpty as L
46- import Data.Map (Map )
46+ import Data.Map.Strict (Map )
4747import qualified Data.Map.Strict as M
4848import Data.Maybe (mapMaybe )
4949import qualified Data.Set as S
@@ -184,7 +184,7 @@ runXFTPRcvWorker c srv Worker {doWork} = do
184184 cfg <- asks config
185185 forever $ do
186186 lift $ waitForWork doWork
187- atomically $ assertAgentForeground c
187+ liftIO $ assertAgentForeground c
188188 runXFTPOperation cfg
189189 where
190190 runXFTPOperation :: AgentConfig -> AM ()
@@ -194,6 +194,7 @@ runXFTPRcvWorker c srv Worker {doWork} = do
194194 (fc@ RcvFileChunk {userId, rcvFileId, rcvFileEntityId, digest, fileTmpPath, replicas = replica@ RcvFileChunkReplica {rcvChunkReplicaId, server, delay} : _}, approvedRelays) -> do
195195 let ri' = maybe ri (\ d -> ri {initialInterval = d, increaseAfter = 0 }) delay
196196 withRetryIntervalLimit xftpConsecutiveRetries ri' $ \ delay' loop -> do
197+ liftIO $ waitWhileSuspended c
197198 liftIO $ waitForUserNetwork c
198199 atomically $ incXFTPServerStat c userId srv downloadAttempts
199200 downloadFileChunk fc replica approvedRelays
@@ -204,7 +205,7 @@ runXFTPRcvWorker c srv Worker {doWork} = do
204205 when (serverHostError e) $ notify c rcvFileEntityId $ RFWARN e
205206 liftIO $ closeXFTPServerClient c userId server digest
206207 withStore' c $ \ db -> updateRcvChunkReplicaDelay db rcvChunkReplicaId replicaDelay
207- atomically $ assertAgentForeground c
208+ liftIO $ assertAgentForeground c
208209 loop
209210 retryDone e = do
210211 atomically . incXFTPServerStat c userId srv $ case e of
@@ -220,7 +221,7 @@ runXFTPRcvWorker c srv Worker {doWork} = do
220221 chunkSpec = XFTPRcvChunkSpec chunkPath chSize (unFileDigest digest)
221222 relChunkPath = fileTmpPath </> takeFileName chunkPath
222223 agentXFTPDownloadChunk c userId digest replica chunkSpec
223- atomically $ waitUntilForeground c
224+ liftIO $ waitUntilForeground c
224225 (entityId, complete, progress) <- withStore c $ \ db -> runExceptT $ do
225226 liftIO $ updateRcvFileChunkReceived db (rcvChunkReplicaId replica) rcvChunkId relChunkPath
226227 RcvFile {size = FileSize currentSize, chunks, redirect} <- ExceptT $ getRcvFile db rcvFileId
@@ -239,7 +240,7 @@ runXFTPRcvWorker c srv Worker {doWork} = do
239240 where
240241 ipAddressProtected' :: AM Bool
241242 ipAddressProtected' = do
242- cfg <- liftIO $ getNetworkConfig' c
243+ cfg <- liftIO $ getFastNetworkConfig c
243244 pure $ ipAddressProtected cfg srv
244245 receivedSize :: [RcvFileChunk ] -> Int64
245246 receivedSize = foldl' (\ sz ch -> sz + receivedChunkSize ch) 0
@@ -272,7 +273,7 @@ runXFTPRcvLocalWorker c Worker {doWork} = do
272273 cfg <- asks config
273274 forever $ do
274275 lift $ waitForWork doWork
275- atomically $ assertAgentForeground c
276+ liftIO $ assertAgentForeground c
276277 runXFTPOperation cfg
277278 where
278279 runXFTPOperation :: AgentConfig -> AM ()
@@ -298,12 +299,12 @@ runXFTPRcvLocalWorker c Worker {doWork} = do
298299 Nothing -> do
299300 notify c rcvFileEntityId $ RFDONE fsSavePath
300301 lift $ forM_ tmpPath (removePath <=< toFSFilePath)
301- atomically $ waitUntilForeground c
302+ liftIO $ waitUntilForeground c
302303 withStore' c (`updateRcvFileComplete` rcvFileId)
303304 Just RcvFileRedirect {redirectFileInfo, redirectDbId} -> do
304305 let RedirectFileInfo {size = redirectSize, digest = redirectDigest} = redirectFileInfo
305306 lift $ forM_ tmpPath (removePath <=< toFSFilePath)
306- atomically $ waitUntilForeground c
307+ liftIO $ waitUntilForeground c
307308 withStore' c (`updateRcvFileComplete` rcvFileId)
308309 -- proceed with redirect
309310 yaml <- liftError (FILE . FILE_IO . show ) (CF. readFile $ CryptoFile fsSavePath cfArgs) `agentFinally` (lift $ toFSFilePath fsSavePath >>= removePath)
@@ -391,7 +392,7 @@ runXFTPSndPrepareWorker c Worker {doWork} = do
391392 cfg <- asks config
392393 forever $ do
393394 lift $ waitForWork doWork
394- atomically $ assertAgentForeground c
395+ liftIO $ assertAgentForeground c
395396 runXFTPOperation cfg
396397 where
397398 runXFTPOperation :: AgentConfig -> AM ()
@@ -453,16 +454,17 @@ runXFTPSndPrepareWorker c Worker {doWork} = do
453454 SndFileChunkReplica {server} : _ -> Right server
454455 createChunk :: Int -> SndFileChunk -> AM (ProtocolServer 'PXFTP)
455456 createChunk numRecipients' ch = do
456- atomically $ assertAgentForeground c
457+ liftIO $ assertAgentForeground c
457458 (replica, ProtoServerWithAuth srv _) <- tryCreate
458459 withStore' c $ \ db -> createSndFileReplica db ch replica
459460 pure srv
460461 where
461462 tryCreate = do
462463 usedSrvs <- newTVarIO ([] :: [XFTPServer ])
463464 let AgentClient {xftpServers} = c
464- userSrvCount <- length <$> atomically ( TM. lookup userId xftpServers)
465+ userSrvCount <- liftIO $ length <$> TM. lookupIO userId xftpServers
465466 withRetryIntervalCount (riFast ri) $ \ n _ loop -> do
467+ liftIO $ waitWhileSuspended c
466468 liftIO $ waitForUserNetwork c
467469 let triedAllSrvs = n > userSrvCount
468470 createWithNextSrv usedSrvs
@@ -472,7 +474,7 @@ runXFTPSndPrepareWorker c Worker {doWork} = do
472474 retryLoop loop triedAllSrvs e = do
473475 flip catchAgentError (\ _ -> pure () ) $ do
474476 when (triedAllSrvs && serverHostError e) $ notify c sndFileEntityId $ SFWARN e
475- atomically $ assertAgentForeground c
477+ liftIO $ assertAgentForeground c
476478 loop
477479 createWithNextSrv usedSrvs = do
478480 deleted <- withStore' c $ \ db -> getSndFileDeleted db sndFileId
@@ -492,7 +494,7 @@ runXFTPSndWorker c srv Worker {doWork} = do
492494 cfg <- asks config
493495 forever $ do
494496 lift $ waitForWork doWork
495- atomically $ assertAgentForeground c
497+ liftIO $ assertAgentForeground c
496498 runXFTPOperation cfg
497499 where
498500 runXFTPOperation :: AgentConfig -> AM ()
@@ -502,6 +504,7 @@ runXFTPSndWorker c srv Worker {doWork} = do
502504 fc@ SndFileChunk {userId, sndFileId, sndFileEntityId, filePrefixPath, digest, replicas = replica@ SndFileChunkReplica {sndChunkReplicaId, server, delay} : _} -> do
503505 let ri' = maybe ri (\ d -> ri {initialInterval = d, increaseAfter = 0 }) delay
504506 withRetryIntervalLimit xftpConsecutiveRetries ri' $ \ delay' loop -> do
507+ liftIO $ waitWhileSuspended c
505508 liftIO $ waitForUserNetwork c
506509 atomically $ incXFTPServerStat c userId srv uploadAttempts
507510 uploadFileChunk cfg fc replica
@@ -512,7 +515,7 @@ runXFTPSndWorker c srv Worker {doWork} = do
512515 when (serverHostError e) $ notify c sndFileEntityId $ SFWARN e
513516 liftIO $ closeXFTPServerClient c userId server digest
514517 withStore' c $ \ db -> updateSndChunkReplicaDelay db sndChunkReplicaId replicaDelay
515- atomically $ assertAgentForeground c
518+ liftIO $ assertAgentForeground c
516519 loop
517520 retryDone e = do
518521 atomically $ incXFTPServerStat c userId srv uploadErrs
@@ -523,9 +526,9 @@ runXFTPSndWorker c srv Worker {doWork} = do
523526 fsFilePath <- lift $ toFSFilePath filePath
524527 unlessM (doesFileExist fsFilePath) $ throwE $ FILE NO_FILE
525528 let chunkSpec' = chunkSpec {filePath = fsFilePath} :: XFTPChunkSpec
526- atomically $ assertAgentForeground c
529+ liftIO $ assertAgentForeground c
527530 agentXFTPUploadChunk c userId chunkDigest replica' chunkSpec'
528- atomically $ waitUntilForeground c
531+ liftIO $ waitUntilForeground c
529532 sf@ SndFile {sndFileEntityId, prefixPath, chunks} <- withStore c $ \ db -> do
530533 updateSndChunkReplicaStatus db sndChunkReplicaId SFRSUploaded
531534 getSndFile db sndFileId
@@ -663,7 +666,7 @@ runXFTPDelWorker c srv Worker {doWork} = do
663666 cfg <- asks config
664667 forever $ do
665668 lift $ waitForWork doWork
666- atomically $ assertAgentForeground c
669+ liftIO $ assertAgentForeground c
667670 runXFTPOperation cfg
668671 where
669672 runXFTPOperation :: AgentConfig -> AM ()
@@ -674,6 +677,7 @@ runXFTPDelWorker c srv Worker {doWork} = do
674677 processDeletedReplica replica@ DeletedSndChunkReplica {deletedSndChunkReplicaId, userId, server, chunkDigest, delay} = do
675678 let ri' = maybe ri (\ d -> ri {initialInterval = d, increaseAfter = 0 }) delay
676679 withRetryIntervalLimit xftpConsecutiveRetries ri' $ \ delay' loop -> do
680+ liftIO $ waitWhileSuspended c
677681 liftIO $ waitForUserNetwork c
678682 atomically $ incXFTPServerStat c userId srv deleteAttempts
679683 deleteChunkReplica
@@ -684,7 +688,7 @@ runXFTPDelWorker c srv Worker {doWork} = do
684688 when (serverHostError e) $ notify c " " $ SFWARN e
685689 liftIO $ closeXFTPServerClient c userId server chunkDigest
686690 withStore' c $ \ db -> updateDeletedSndChunkReplicaDelay db deletedSndChunkReplicaId replicaDelay
687- atomically $ assertAgentForeground c
691+ liftIO $ assertAgentForeground c
688692 loop
689693 retryDone e = do
690694 atomically $ incXFTPServerStat c userId srv deleteErrs
@@ -699,7 +703,7 @@ delWorkerInternalError c deletedSndChunkReplicaId e = do
699703 withStore' c $ \ db -> deleteDeletedSndChunkReplica db deletedSndChunkReplicaId
700704 notify c " " $ SFERR e
701705
702- assertAgentForeground :: AgentClient -> STM ()
706+ assertAgentForeground :: AgentClient -> IO ()
703707assertAgentForeground c = do
704708 throwWhenInactive c
705709 waitUntilForeground c
0 commit comments