@@ -43,7 +43,7 @@ import Data.Either (partitionEithers, rights)
43
43
import Data.Int (Int64 )
44
44
import Data.List (foldl' , partition , sortOn )
45
45
import qualified Data.List.NonEmpty as L
46
- import Data.Map (Map )
46
+ import Data.Map.Strict (Map )
47
47
import qualified Data.Map.Strict as M
48
48
import Data.Maybe (mapMaybe )
49
49
import qualified Data.Set as S
@@ -184,7 +184,7 @@ runXFTPRcvWorker c srv Worker {doWork} = do
184
184
cfg <- asks config
185
185
forever $ do
186
186
lift $ waitForWork doWork
187
- atomically $ assertAgentForeground c
187
+ liftIO $ assertAgentForeground c
188
188
runXFTPOperation cfg
189
189
where
190
190
runXFTPOperation :: AgentConfig -> AM ()
@@ -194,6 +194,7 @@ runXFTPRcvWorker c srv Worker {doWork} = do
194
194
(fc@ RcvFileChunk {userId, rcvFileId, rcvFileEntityId, digest, fileTmpPath, replicas = replica@ RcvFileChunkReplica {rcvChunkReplicaId, server, delay} : _}, approvedRelays) -> do
195
195
let ri' = maybe ri (\ d -> ri {initialInterval = d, increaseAfter = 0 }) delay
196
196
withRetryIntervalLimit xftpConsecutiveRetries ri' $ \ delay' loop -> do
197
+ liftIO $ waitWhileSuspended c
197
198
liftIO $ waitForUserNetwork c
198
199
atomically $ incXFTPServerStat c userId srv downloadAttempts
199
200
downloadFileChunk fc replica approvedRelays
@@ -204,7 +205,7 @@ runXFTPRcvWorker c srv Worker {doWork} = do
204
205
when (serverHostError e) $ notify c rcvFileEntityId $ RFWARN e
205
206
liftIO $ closeXFTPServerClient c userId server digest
206
207
withStore' c $ \ db -> updateRcvChunkReplicaDelay db rcvChunkReplicaId replicaDelay
207
- atomically $ assertAgentForeground c
208
+ liftIO $ assertAgentForeground c
208
209
loop
209
210
retryDone e = do
210
211
atomically . incXFTPServerStat c userId srv $ case e of
@@ -220,7 +221,7 @@ runXFTPRcvWorker c srv Worker {doWork} = do
220
221
chunkSpec = XFTPRcvChunkSpec chunkPath chSize (unFileDigest digest)
221
222
relChunkPath = fileTmpPath </> takeFileName chunkPath
222
223
agentXFTPDownloadChunk c userId digest replica chunkSpec
223
- atomically $ waitUntilForeground c
224
+ liftIO $ waitUntilForeground c
224
225
(entityId, complete, progress) <- withStore c $ \ db -> runExceptT $ do
225
226
liftIO $ updateRcvFileChunkReceived db (rcvChunkReplicaId replica) rcvChunkId relChunkPath
226
227
RcvFile {size = FileSize currentSize, chunks, redirect} <- ExceptT $ getRcvFile db rcvFileId
@@ -239,7 +240,7 @@ runXFTPRcvWorker c srv Worker {doWork} = do
239
240
where
240
241
ipAddressProtected' :: AM Bool
241
242
ipAddressProtected' = do
242
- cfg <- liftIO $ getNetworkConfig' c
243
+ cfg <- liftIO $ getFastNetworkConfig c
243
244
pure $ ipAddressProtected cfg srv
244
245
receivedSize :: [RcvFileChunk ] -> Int64
245
246
receivedSize = foldl' (\ sz ch -> sz + receivedChunkSize ch) 0
@@ -272,7 +273,7 @@ runXFTPRcvLocalWorker c Worker {doWork} = do
272
273
cfg <- asks config
273
274
forever $ do
274
275
lift $ waitForWork doWork
275
- atomically $ assertAgentForeground c
276
+ liftIO $ assertAgentForeground c
276
277
runXFTPOperation cfg
277
278
where
278
279
runXFTPOperation :: AgentConfig -> AM ()
@@ -298,12 +299,12 @@ runXFTPRcvLocalWorker c Worker {doWork} = do
298
299
Nothing -> do
299
300
notify c rcvFileEntityId $ RFDONE fsSavePath
300
301
lift $ forM_ tmpPath (removePath <=< toFSFilePath)
301
- atomically $ waitUntilForeground c
302
+ liftIO $ waitUntilForeground c
302
303
withStore' c (`updateRcvFileComplete` rcvFileId)
303
304
Just RcvFileRedirect {redirectFileInfo, redirectDbId} -> do
304
305
let RedirectFileInfo {size = redirectSize, digest = redirectDigest} = redirectFileInfo
305
306
lift $ forM_ tmpPath (removePath <=< toFSFilePath)
306
- atomically $ waitUntilForeground c
307
+ liftIO $ waitUntilForeground c
307
308
withStore' c (`updateRcvFileComplete` rcvFileId)
308
309
-- proceed with redirect
309
310
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
391
392
cfg <- asks config
392
393
forever $ do
393
394
lift $ waitForWork doWork
394
- atomically $ assertAgentForeground c
395
+ liftIO $ assertAgentForeground c
395
396
runXFTPOperation cfg
396
397
where
397
398
runXFTPOperation :: AgentConfig -> AM ()
@@ -453,16 +454,17 @@ runXFTPSndPrepareWorker c Worker {doWork} = do
453
454
SndFileChunkReplica {server} : _ -> Right server
454
455
createChunk :: Int -> SndFileChunk -> AM (ProtocolServer 'PXFTP)
455
456
createChunk numRecipients' ch = do
456
- atomically $ assertAgentForeground c
457
+ liftIO $ assertAgentForeground c
457
458
(replica, ProtoServerWithAuth srv _) <- tryCreate
458
459
withStore' c $ \ db -> createSndFileReplica db ch replica
459
460
pure srv
460
461
where
461
462
tryCreate = do
462
463
usedSrvs <- newTVarIO ([] :: [XFTPServer ])
463
464
let AgentClient {xftpServers} = c
464
- userSrvCount <- length <$> atomically ( TM. lookup userId xftpServers)
465
+ userSrvCount <- liftIO $ length <$> TM. lookupIO userId xftpServers
465
466
withRetryIntervalCount (riFast ri) $ \ n _ loop -> do
467
+ liftIO $ waitWhileSuspended c
466
468
liftIO $ waitForUserNetwork c
467
469
let triedAllSrvs = n > userSrvCount
468
470
createWithNextSrv usedSrvs
@@ -472,7 +474,7 @@ runXFTPSndPrepareWorker c Worker {doWork} = do
472
474
retryLoop loop triedAllSrvs e = do
473
475
flip catchAgentError (\ _ -> pure () ) $ do
474
476
when (triedAllSrvs && serverHostError e) $ notify c sndFileEntityId $ SFWARN e
475
- atomically $ assertAgentForeground c
477
+ liftIO $ assertAgentForeground c
476
478
loop
477
479
createWithNextSrv usedSrvs = do
478
480
deleted <- withStore' c $ \ db -> getSndFileDeleted db sndFileId
@@ -492,7 +494,7 @@ runXFTPSndWorker c srv Worker {doWork} = do
492
494
cfg <- asks config
493
495
forever $ do
494
496
lift $ waitForWork doWork
495
- atomically $ assertAgentForeground c
497
+ liftIO $ assertAgentForeground c
496
498
runXFTPOperation cfg
497
499
where
498
500
runXFTPOperation :: AgentConfig -> AM ()
@@ -502,6 +504,7 @@ runXFTPSndWorker c srv Worker {doWork} = do
502
504
fc@ SndFileChunk {userId, sndFileId, sndFileEntityId, filePrefixPath, digest, replicas = replica@ SndFileChunkReplica {sndChunkReplicaId, server, delay} : _} -> do
503
505
let ri' = maybe ri (\ d -> ri {initialInterval = d, increaseAfter = 0 }) delay
504
506
withRetryIntervalLimit xftpConsecutiveRetries ri' $ \ delay' loop -> do
507
+ liftIO $ waitWhileSuspended c
505
508
liftIO $ waitForUserNetwork c
506
509
atomically $ incXFTPServerStat c userId srv uploadAttempts
507
510
uploadFileChunk cfg fc replica
@@ -512,7 +515,7 @@ runXFTPSndWorker c srv Worker {doWork} = do
512
515
when (serverHostError e) $ notify c sndFileEntityId $ SFWARN e
513
516
liftIO $ closeXFTPServerClient c userId server digest
514
517
withStore' c $ \ db -> updateSndChunkReplicaDelay db sndChunkReplicaId replicaDelay
515
- atomically $ assertAgentForeground c
518
+ liftIO $ assertAgentForeground c
516
519
loop
517
520
retryDone e = do
518
521
atomically $ incXFTPServerStat c userId srv uploadErrs
@@ -523,9 +526,9 @@ runXFTPSndWorker c srv Worker {doWork} = do
523
526
fsFilePath <- lift $ toFSFilePath filePath
524
527
unlessM (doesFileExist fsFilePath) $ throwE $ FILE NO_FILE
525
528
let chunkSpec' = chunkSpec {filePath = fsFilePath} :: XFTPChunkSpec
526
- atomically $ assertAgentForeground c
529
+ liftIO $ assertAgentForeground c
527
530
agentXFTPUploadChunk c userId chunkDigest replica' chunkSpec'
528
- atomically $ waitUntilForeground c
531
+ liftIO $ waitUntilForeground c
529
532
sf@ SndFile {sndFileEntityId, prefixPath, chunks} <- withStore c $ \ db -> do
530
533
updateSndChunkReplicaStatus db sndChunkReplicaId SFRSUploaded
531
534
getSndFile db sndFileId
@@ -663,7 +666,7 @@ runXFTPDelWorker c srv Worker {doWork} = do
663
666
cfg <- asks config
664
667
forever $ do
665
668
lift $ waitForWork doWork
666
- atomically $ assertAgentForeground c
669
+ liftIO $ assertAgentForeground c
667
670
runXFTPOperation cfg
668
671
where
669
672
runXFTPOperation :: AgentConfig -> AM ()
@@ -674,6 +677,7 @@ runXFTPDelWorker c srv Worker {doWork} = do
674
677
processDeletedReplica replica@ DeletedSndChunkReplica {deletedSndChunkReplicaId, userId, server, chunkDigest, delay} = do
675
678
let ri' = maybe ri (\ d -> ri {initialInterval = d, increaseAfter = 0 }) delay
676
679
withRetryIntervalLimit xftpConsecutiveRetries ri' $ \ delay' loop -> do
680
+ liftIO $ waitWhileSuspended c
677
681
liftIO $ waitForUserNetwork c
678
682
atomically $ incXFTPServerStat c userId srv deleteAttempts
679
683
deleteChunkReplica
@@ -684,7 +688,7 @@ runXFTPDelWorker c srv Worker {doWork} = do
684
688
when (serverHostError e) $ notify c " " $ SFWARN e
685
689
liftIO $ closeXFTPServerClient c userId server chunkDigest
686
690
withStore' c $ \ db -> updateDeletedSndChunkReplicaDelay db deletedSndChunkReplicaId replicaDelay
687
- atomically $ assertAgentForeground c
691
+ liftIO $ assertAgentForeground c
688
692
loop
689
693
retryDone e = do
690
694
atomically $ incXFTPServerStat c userId srv deleteErrs
@@ -699,7 +703,7 @@ delWorkerInternalError c deletedSndChunkReplicaId e = do
699
703
withStore' c $ \ db -> deleteDeletedSndChunkReplica db deletedSndChunkReplicaId
700
704
notify c " " $ SFERR e
701
705
702
- assertAgentForeground :: AgentClient -> STM ()
706
+ assertAgentForeground :: AgentClient -> IO ()
703
707
assertAgentForeground c = do
704
708
throwWhenInactive c
705
709
waitUntilForeground c
0 commit comments