From 9785222714d65ded2274723c8b0a210c6152ea36 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 25 May 2017 16:02:17 -0400 Subject: 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. --- Annex/Transfer.hs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'Annex') 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 -- cgit v1.2.3