better transfer queue management

Allow transfers to be added with blocking until the queue is sufficiently
small.

Better control over which end of the queue to add a transfer to.
This commit is contained in:
Joey Hess 2012-07-25 13:12:34 -04:00
parent 6107328a6b
commit a9dbfdf28d
4 changed files with 52 additions and 25 deletions

View file

@ -161,7 +161,7 @@ handleAdds st changechan transferqueue dstatus cs = returnWhen (null pendingadds
sha <- inRepo $
Git.HashObject.hashObject BlobObject link
stageSymlink file sha
queueTransfers transferqueue dstatus key (Just file) Upload
queueTransfers Next transferqueue dstatus key (Just file) Upload
showEndOk
return $ Just change

View file

@ -18,16 +18,23 @@ import Utility.ThreadScheduler
thisThread :: ThreadName
thisThread = "TransferScanner"
{- This thread scans remotes, to find transfers that need to be made to
- keep their data in sync. The transfers are queued with low priority. -}
{- This thread waits until a remote needs to be scanned, to find transfers
- that need to be made, to keep data in sync.
-
- Remotes are scanned in the background; the scan is blocked when the
- transfer queue gets too large.
-}
transferScannerThread :: ThreadState -> ScanRemoteMap -> TransferQueue -> IO ()
transferScannerThread st scanremotes transferqueue = do
runEvery (Seconds 2) $ do
r <- getScanRemote scanremotes
needtransfer <- scan st r
forM_ needtransfer $ \(f, t) ->
queueLaterTransfer transferqueue f t
queueTransferAt smallsize Later transferqueue f t
where
smallsize = 10
{- -}
scan :: ThreadState -> Remote -> IO [(AssociatedFile, Transfer)]
scan st r = do
debug thisThread ["scanning", show r]

View file

@ -206,7 +206,7 @@ onAddSymlink threadname file filestatus dstatus transferqueue = go =<< Backend.l
- try to get the key's content. -}
checkcontent key daemonstatus
| scanComplete daemonstatus = unlessM (inAnnex key) $
queueTransfers transferqueue dstatus
queueTransfers Next transferqueue dstatus
key (Just file) Download
| otherwise = noop