aboutsummaryrefslogtreecommitdiff
path: root/Logs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-05-12 18:34:49 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-05-12 18:34:49 -0400
commitb38e187c0bfd6f4bcef6c235c555752aca193edc (patch)
treec241422b41862329c5a55b3f2c8c6cf01842db57 /Logs
parent9995d85437a7a702756de21d3f92519c28f820d6 (diff)
an optimization that also fixes a reversion
This is a little optimisation; avoid loading the info file for the download of the current key when checking for other downloads. The reversion it fixes is sorta strange. b94eafec8c4a7868da753f9b22ca823552e9764c broke checking for transfers that were already in progress. Indeed, the transfer lock was not held after getTransfers was called. Why? I think it's magic in ghc's handling of getLock and setLock, although it's hard to tell since those functions are almost entirely undocumented as to their semantics. Something, either the RTS (or maybe it's linux?) notices that the same process has taken a lock and is now calling getLock on a FD attached to the same file. So, it drops the lock. So, this optimisation avoids that problematic behavior.
Diffstat (limited to 'Logs')
-rw-r--r--Logs/Transfer.hs14
1 files changed, 7 insertions, 7 deletions
diff --git a/Logs/Transfer.hs b/Logs/Transfer.hs
index 6d655033d..0ee69b63f 100644
--- a/Logs/Transfer.hs
+++ b/Logs/Transfer.hs
@@ -147,11 +147,12 @@ checkTransfer t = do
{- Gets all currently running transfers. -}
getTransfers :: Annex [(Transfer, TransferInfo)]
-getTransfers = getTransfers' [Download, Upload]
+getTransfers = getTransfers' [Download, Upload] (const True)
-getTransfers' :: [Direction] -> Annex [(Transfer, TransferInfo)]
-getTransfers' dirs = do
- transfers <- mapMaybe parseTransferFile . concat <$> findfiles
+getTransfers' :: [Direction] -> (Key -> Bool) -> Annex [(Transfer, TransferInfo)]
+getTransfers' dirs wanted = do
+ transfers <- filter (wanted . transferKey)
+ <$> mapMaybe parseTransferFile . concat <$> findfiles
infos <- mapM checkTransfer transfers
return $ map (\(t, Just i) -> (t, i)) $
filter running $ zip transfers infos
@@ -163,10 +164,9 @@ getTransfers' dirs = do
{- Number of bytes remaining to download from matching downloads that are in
- progress. -}
sizeOfDownloadsInProgress :: (Key -> Bool) -> Annex Integer
-sizeOfDownloadsInProgress match = sum . map remaining . filter wanted
- <$> getTransfers' [Download]
+sizeOfDownloadsInProgress wanted = sum . map remaining
+ <$> getTransfers' [Download] wanted
where
- wanted (t, _) = match (transferKey t)
remaining (t, info) =
case (keySize (transferKey t), bytesComplete info) of
(Just sz, Just done) -> sz - done