aboutsummaryrefslogtreecommitdiff
path: root/Assistant/Threads
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2017-09-20 13:27:59 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2017-09-20 13:58:27 -0400
commitd20933a25956a3a07247f66fe3a554761d616173 (patch)
tree47bd006b6255beac3b7286977988c64dce6236a2 /Assistant/Threads
parent7fa114e629fe33822763f376ac57b0efd48d5686 (diff)
first pass at assistant knowing about export remotes
Split exportRemotes out from syncDataRemotes; the parts of the assistant that upload keys and drop keys from remotes don't apply to exports, because those operations are not supported. Some parts of the assistant and webapp do operate on both syncDataRemotes and exportRemotes. Particularly when downloading from either of them. Added a downloadRemotes that combines both. With this, the assistant should download from exports, but it won't yet upload changes to them. This commit was sponsored by Fernando Jimenez on Patreon.
Diffstat (limited to 'Assistant/Threads')
-rw-r--r--Assistant/Threads/Glacier.hs2
-rw-r--r--Assistant/Threads/TransferScanner.hs33
2 files changed, 20 insertions, 15 deletions
diff --git a/Assistant/Threads/Glacier.hs b/Assistant/Threads/Glacier.hs
index b5eaa5ea9..2fd025df1 100644
--- a/Assistant/Threads/Glacier.hs
+++ b/Assistant/Threads/Glacier.hs
@@ -29,7 +29,7 @@ glacierThread = namedThread "Glacier" $ runEvery (Seconds 3600) <~> go
where
isglacier r = Remote.remotetype r == Glacier.remote
go = do
- rs <- filter isglacier . syncDataRemotes <$> getDaemonStatus
+ rs <- filter isglacier . downloadRemotes <$> getDaemonStatus
forM_ rs $ \r ->
check r =<< liftAnnex (getFailedTransfers $ Remote.uuid r)
check _ [] = noop
diff --git a/Assistant/Threads/TransferScanner.hs b/Assistant/Threads/TransferScanner.hs
index 4b6a90cd9..fd77b88d2 100644
--- a/Assistant/Threads/TransferScanner.hs
+++ b/Assistant/Threads/TransferScanner.hs
@@ -78,7 +78,7 @@ transferScannerThread urlrenderer = namedThread "TransferScanner" $ do
-}
startupScan = do
reconnectRemotes =<< syncGitRemotes <$> getDaemonStatus
- addScanRemotes True =<< syncDataRemotes <$> getDaemonStatus
+ addScanRemotes True =<< scannableRemotes
{- This is a cheap scan for failed transfers involving a remote. -}
failedTransferScan :: Remote -> Assistant ()
@@ -157,24 +157,29 @@ expensiveScan urlrenderer rs = batch <~> do
(AssociatedFile (Just f)) t r
findtransfers f unwanted key = do
let af = AssociatedFile (Just f)
- {- The syncable remotes may have changed since this
- - scan began. -}
- syncrs <- syncDataRemotes <$> getDaemonStatus
locs <- liftAnnex $ loggedLocations key
present <- liftAnnex $ inAnnex key
+ let slocs = S.fromList locs
+
+ {- The remotes may have changed since this scan began. -}
+ syncrs <- syncDataRemotes <$> getDaemonStatus
+ let use l a = mapMaybe (a key slocs) . l <$> getDaemonStatus
+
liftAnnex $ handleDropsFrom locs syncrs
"expensive scan found too many copies of object"
present key af [] callCommandAction
- liftAnnex $ do
- let slocs = S.fromList locs
- let use a = return $ mapMaybe (a key slocs) syncrs
- ts <- if present
- then filterM (wantSend True (Just key) af . Remote.uuid . fst)
- =<< use (genTransfer Upload False)
- else ifM (wantGet True (Just key) af)
- ( use (genTransfer Download True) , return [] )
- let unwanted' = S.difference unwanted slocs
- return (unwanted', ts)
+ ts <- if present
+ then liftAnnex . filterM (wantSend True (Just key) af . Remote.uuid . fst)
+ =<< use syncDataRemotes (genTransfer Upload False)
+ else ifM (liftAnnex $ wantGet True (Just key) af)
+ ( use downloadRemotes (genTransfer Download True) , return [] )
+ let unwanted' = S.difference unwanted slocs
+ return (unwanted', ts)
+
+-- Both syncDataRemotes and exportRemotes can be scanned.
+-- The downloadRemotes list contains both.
+scannableRemotes :: Assistant [Remote]
+scannableRemotes = downloadRemotes <$> getDaemonStatus
genTransfer :: Direction -> Bool -> Key -> S.Set UUID -> Remote -> Maybe (Remote, Transfer)
genTransfer direction want key slocs r