summaryrefslogtreecommitdiff
path: root/Annex
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2017-05-25 16:02:17 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2017-05-25 17:40:23 -0400
commit9785222714d65ded2274723c8b0a210c6152ea36 (patch)
tree2cc0a99fbe0dd9f4924aa5b7e5bbbfe36e7cb80b /Annex
parentbb803411fb99e482dca0c1c0aa740f28b4a98820 (diff)
Fix transfer log file locking problem when running concurrent transfers.
orElse is great, but was not the right thing to use here because waitTakeLock could retry for other reasons than the lock being held, which made tryTakeLock fail when it shouldn't. Instead, move the code to tryTakeLock and implement waitTakeLock using tryTakeLock and retry. (Also, in runTransfer, when checkSaneLock fails, dropLock to avoid leaking a lock handle.) This commit was supported by the NSF-funded DataLad project.
Diffstat (limited to 'Annex')
-rw-r--r--Annex/Transfer.hs4
1 files changed, 3 insertions, 1 deletions
diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs
index 87480b2f1..3fcf1a1b9 100644
--- a/Annex/Transfer.hs
+++ b/Annex/Transfer.hs
@@ -118,7 +118,9 @@ runTransfer' ignorelock t afile shouldretry transferaction = checkSecureHashes t
void $ liftIO $ tryIO $
writeTransferInfoFile info tfile
return (Just lockhandle, False)
- , return (Nothing, True)
+ , do
+ liftIO $ dropLock lockhandle
+ return (Nothing, True)
)
#else
prep tfile _mode info = catchPermissionDenied (const prepfailed) $ do