diff --git a/Utility/Metered.hs b/Utility/Metered.hs index 1e12444d60..21c9cd8455 100644 --- a/Utility/Metered.hs +++ b/Utility/Metered.hs @@ -397,23 +397,27 @@ bwLimitMeterUpdate bwlimit duration meterupdate | bwlimit <= 0 = return meterupdate | otherwise = do nowtime <- getPOSIXTime - mv <- newMVar (nowtime, 0) + mv <- newMVar (nowtime, Nothing) return (mu mv) where mu mv n@(BytesProcessed i) = do endtime <- getPOSIXTime - (starttime, previ) <- takeMVar mv + (starttime, mprevi) <- takeMVar mv + + case mprevi of + Just previ -> do + let runtime = endtime - starttime + let currbw = fromIntegral (i - previ) / runtime + let pausescale = if currbw > bwlimit' + then (currbw / bwlimit') - 1 + else 0 + unboundDelay (floor (runtime * pausescale * msecs)) + Nothing -> return () - let runtime = endtime - starttime - let currbw = fromIntegral (i - previ) / runtime - let pausescale = if currbw > bwlimit' - then (currbw / bwlimit') - 1 - else 0 - unboundDelay (floor (runtime * pausescale * msecs)) meterupdate n nowtime <- getPOSIXTime - putMVar mv (nowtime, i) + putMVar mv (nowtime, Just i) bwlimit' = fromIntegral (bwlimit * durationSeconds duration) msecs = fromIntegral oneSecond diff --git a/doc/todo/bwlimit.mdwn b/doc/todo/bwlimit.mdwn index a582f62b19..674aaa1009 100644 --- a/doc/todo/bwlimit.mdwn +++ b/doc/todo/bwlimit.mdwn @@ -10,9 +10,9 @@ works, it will probably work to put the delay in there. --[[Joey]] [[confirmed]] -> Implemented and works well. -> -> A local git remote, when resuming an interrupted +> Implemented and works well. [[done]] --[[Joey]] + +> Note: A local git remote, when resuming an interrupted > transfer, has to hash the file (with default annex.verify settings), > and that hashing updates the progress bar, and so the bwlimit can kick > in and slow down that initial hashing, before any data copying begins. @@ -20,8 +20,7 @@ works, it will probably work to put the delay in there. --[[Joey]] > remote you're wanting to limit disk IO. Only reason it might not be ok > is if the intent is to limit IO to the disk containing the remote > but not the one containing the annex repo. (This also probably -> holds for the directory special remote.) -> +> holds for the directory special remote.) > Other remotes, including git over ssh, when resuming don't have that > problem. Looks like chunked special remotes narrowly avoid it, just > because their implementation choose to not do incremental verification @@ -37,5 +36,3 @@ works, it will probably work to put the delay in there. --[[Joey]] > tend to be 32kb or so, and the pauses a small fraction of a second. So > mentioning this only for completeness.) --[[Joey]] -[[done]] -