disable buggy concurrency in Command.Export
Fix a crash or potentially not all files being exported when sync -J --content is used with an export remote. Crash as described in fixed bug report. waitForAllRunningCommandActions inserted in several points where all the commandActions started before need to have finished before moving on to the next stage of the export. A race across those points could have maybe resulted in not all files being exported, or a wrong tree being export. For example, changeExport starting up an action like a rename of A to B. Then, with that action still running, fillExport uploading a new A, *before* the rename occurred. That race seems unlikely to have happened. There are some other ones that this also fixes.
This commit is contained in:
parent
51432a6704
commit
864ba4ecaa
4 changed files with 52 additions and 8 deletions
|
@ -1,6 +1,6 @@
|
|||
{- git-annex command-line actions and concurrency
|
||||
-
|
||||
- Copyright 2010-2019 Joey Hess <id@joeyh.name>
|
||||
- Copyright 2010-2020 Joey Hess <id@joeyh.name>
|
||||
-
|
||||
- Licensed under the GNU AGPL version 3 or higher.
|
||||
-}
|
||||
|
@ -136,6 +136,15 @@ finishCommandActions = Annex.getState Annex.workers >>= \case
|
|||
else retry
|
||||
mapM_ mergeState sts
|
||||
|
||||
{- Waits for all worker threads that have been started so far to finish. -}
|
||||
waitForAllRunningCommandActions :: Annex ()
|
||||
waitForAllRunningCommandActions = Annex.getState Annex.workers >>= \case
|
||||
Nothing -> noop
|
||||
Just tv -> liftIO $ atomically $ do
|
||||
pool <- readTMVar tv
|
||||
unless (allIdle pool)
|
||||
retry
|
||||
|
||||
{- Like commandAction, but without the concurrency. -}
|
||||
includeCommandAction :: CommandStart -> CommandCleanup
|
||||
includeCommandAction start =
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue