have setConcurrency stop any running git coprocesses

When non-concurrent git coprocesses have been started, setConcurrency
used to not stop them, and so could leak processes when enabling
concurrency, eg when forkState is called.

I do not think that ever actually happened, given where setConcurrency
is called. And it probably would only leak one of each process, since it
never downgrades from concurrent to non-concurrent.
This commit is contained in:
Joey Hess 2021-11-19 11:53:25 -04:00
parent 261947683b
commit 15d617f7e1
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
3 changed files with 39 additions and 12 deletions

View file

@ -17,6 +17,7 @@ import qualified Annex.Queue
import Annex.Action
import Types.Concurrency
import Types.CatFileHandles
import Annex.CatFile
import Annex.CheckAttr
import Annex.CheckIgnore
@ -32,18 +33,31 @@ setConcurrency' NonConcurrent f =
{ Annex.concurrency = f NonConcurrent
}
setConcurrency' c f = do
cfh <- getState Annex.catfilehandles
cfh' <- case cfh of
CatFileHandlesNonConcurrent _ -> liftIO catFileHandlesPool
CatFileHandlesPool _ -> pure cfh
cah <- mkConcurrentCheckAttrHandle c
cih <- mkConcurrentCheckIgnoreHandle c
Annex.changeState $ \s -> s
{ Annex.concurrency = f c
, Annex.catfilehandles = cfh'
, Annex.checkattrhandle = Just cah
, Annex.checkignorehandle = Just cih
}
oldc <- Annex.getState Annex.concurrency
case oldc of
ConcurrencyCmdLine NonConcurrent -> fromnonconcurrent
ConcurrencyGitConfig NonConcurrent -> fromnonconcurrent
_
| oldc == newc -> return ()
| otherwise ->
Annex.changeState $ \s -> s
{ Annex.concurrency = newc
}
where
newc = f c
fromnonconcurrent = do
catFileStop
checkAttrStop
checkIgnoreStop
cfh <- liftIO catFileHandlesPool
cah <- mkConcurrentCheckAttrHandle c
cih <- mkConcurrentCheckIgnoreHandle c
Annex.changeState $ \s -> s
{ Annex.concurrency = newc
, Annex.catfilehandles = cfh
, Annex.checkattrhandle = Just cah
, Annex.checkignorehandle = Just cih
}
{- Allows forking off a thread that uses a copy of the current AnnexState
- to run an Annex action.

View file

@ -22,3 +22,4 @@ parseConcurrency s = Concurrent <$> readish s
data ConcurrencySetting
= ConcurrencyCmdLine Concurrency
| ConcurrencyGitConfig Concurrency
deriving (Eq)

View file

@ -0,0 +1,12 @@
[[!comment format=mdwn
username="joey"
subject="""comment 12"""
date="2021-11-19T15:37:43Z"
content="""
I found a case where zombie git processes could be started in theory,
but only when git-annex is run without -J. And only a few zombies I think.
And I couldn't find a code path where it actually happened.
So not the same as this bug. But it did involve setConcurrency, which
the bisected commit also involves (via forkState), so at least shows
how that could cause a such a problem in theory. Fixed that.
"""]]