From 643b233860408fad37482435a5abb348f144293e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 12 May 2015 18:34:49 -0400 Subject: [PATCH] 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. a812d598ef90b3778258f197b2fcb86d51d83d72 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. --- Logs/Transfer.hs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Logs/Transfer.hs b/Logs/Transfer.hs index 6d655033d6..0ee69b63f3 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