explicitly wait for a git process
Eliminate a zombie that was only cleaned up by the later zombie cleanup code. This is still not ideal, it would be cleaner if it used conduit or something, and if the thread gets killed before waiting, it won't stop the process. Only remaining zombies are in CmdLine.Seek
This commit is contained in:
parent
b5b1aeacba
commit
ca454c47f2
4 changed files with 25 additions and 22 deletions
|
@ -393,24 +393,26 @@ commitIndex' jl branchref message basemessage retrynum parents = do
|
||||||
|
|
||||||
{- Lists all files on the branch. including ones in the journal
|
{- Lists all files on the branch. including ones in the journal
|
||||||
- that have not been committed yet. There may be duplicates in the list. -}
|
- that have not been committed yet. There may be duplicates in the list. -}
|
||||||
files :: Annex [RawFilePath]
|
files :: Annex ([RawFilePath], IO Bool)
|
||||||
files = do
|
files = do
|
||||||
_ <- update
|
_ <- update
|
||||||
|
(bfs, cleanup) <- branchFiles
|
||||||
-- ++ forces the content of the first list to be buffered in memory,
|
-- ++ forces the content of the first list to be buffered in memory,
|
||||||
-- so use getJournalledFilesStale which should be much smaller most
|
-- so use getJournalledFilesStale which should be much smaller most
|
||||||
-- of the time. branchFiles will stream as the list is consumed.
|
-- of the time. branchFiles will stream as the list is consumed.
|
||||||
(++)
|
l <- (++)
|
||||||
<$> (map toRawFilePath <$> getJournalledFilesStale)
|
<$> (map toRawFilePath <$> getJournalledFilesStale)
|
||||||
<*> branchFiles
|
<*> pure bfs
|
||||||
|
return (l, cleanup)
|
||||||
|
|
||||||
{- Files in the branch, not including any from journalled changes,
|
{- Files in the branch, not including any from journalled changes,
|
||||||
- and without updating the branch. -}
|
- and without updating the branch. -}
|
||||||
branchFiles :: Annex [RawFilePath]
|
branchFiles :: Annex ([RawFilePath], IO Bool)
|
||||||
branchFiles = withIndex $ inRepo branchFiles'
|
branchFiles = withIndex $ inRepo branchFiles'
|
||||||
|
|
||||||
branchFiles' :: Git.Repo -> IO [RawFilePath]
|
branchFiles' :: Git.Repo -> IO ([RawFilePath], IO Bool)
|
||||||
branchFiles' = Git.Command.pipeNullSplitZombie'
|
branchFiles' = Git.Command.pipeNullSplit' $
|
||||||
(lsTreeParams Git.LsTree.LsTreeRecursive fullname [Param "--name-only"])
|
lsTreeParams Git.LsTree.LsTreeRecursive fullname [Param "--name-only"]
|
||||||
|
|
||||||
{- Populates the branch's index file with the current branch contents.
|
{- Populates the branch's index file with the current branch contents.
|
||||||
-
|
-
|
||||||
|
@ -620,10 +622,11 @@ performTransitionsLocked jl ts neednewlocalbranch transitionedrefs = do
|
||||||
remoteconfigmap <- calcRemoteConfigMap <$> getStaged remoteLog
|
remoteconfigmap <- calcRemoteConfigMap <$> getStaged remoteLog
|
||||||
-- partially apply, improves performance
|
-- partially apply, improves performance
|
||||||
let changers' = map (\c -> c config trustmap remoteconfigmap) changers
|
let changers' = map (\c -> c config trustmap remoteconfigmap) changers
|
||||||
fs <- branchFiles
|
(fs, cleanup) <- branchFiles
|
||||||
forM_ fs $ \f -> do
|
forM_ fs $ \f -> do
|
||||||
content <- getStaged f
|
content <- getStaged f
|
||||||
apply changers' f content
|
apply changers' f content
|
||||||
|
liftIO $ void cleanup
|
||||||
apply [] _ _ = return ()
|
apply [] _ _ = return ()
|
||||||
apply (changer:rest) file content = case changer file content of
|
apply (changer:rest) file content = case changer file content of
|
||||||
PreserveFile -> apply rest file content
|
PreserveFile -> apply rest file content
|
||||||
|
|
|
@ -532,8 +532,9 @@ cachedRemoteData u = do
|
||||||
let combinedata d uk = finishCheck uk >>= \case
|
let combinedata d uk = finishCheck uk >>= \case
|
||||||
Nothing -> return d
|
Nothing -> return d
|
||||||
Just k -> return $ addKey k d
|
Just k -> return $ addKey k d
|
||||||
v <- lift $ foldM combinedata emptyKeyInfo
|
(ks, cleanup) <- lift $ loggedKeysFor' u
|
||||||
=<< loggedKeysFor' u
|
v <- lift $ foldM combinedata emptyKeyInfo ks
|
||||||
|
liftIO $ void cleanup
|
||||||
put s { repoData = M.insert u v (repoData s) }
|
put s { repoData = M.insert u v (repoData s) }
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
|
|
@ -134,12 +134,6 @@ pipeNullSplitStrict params repo = do
|
||||||
s <- pipeReadStrict params repo
|
s <- pipeReadStrict params repo
|
||||||
return $ filter (not . S.null) $ S.split 0 s
|
return $ filter (not . S.null) $ S.split 0 s
|
||||||
|
|
||||||
pipeNullSplitZombie :: [CommandParam] -> Repo -> IO [L.ByteString]
|
|
||||||
pipeNullSplitZombie params repo = leaveZombie <$> pipeNullSplit params repo
|
|
||||||
|
|
||||||
pipeNullSplitZombie' :: [CommandParam] -> Repo -> IO [S.ByteString]
|
|
||||||
pipeNullSplitZombie' params repo = leaveZombie <$> pipeNullSplit' params repo
|
|
||||||
|
|
||||||
{- Doesn't run the cleanup action. A zombie results. -}
|
{- Doesn't run the cleanup action. A zombie results. -}
|
||||||
leaveZombie :: (a, IO Bool) -> a
|
leaveZombie :: (a, IO Bool) -> a
|
||||||
leaveZombie = fst
|
leaveZombie = fst
|
||||||
|
|
|
@ -126,14 +126,15 @@ finishCheck (Unchecked a) = a
|
||||||
-
|
-
|
||||||
- Keys that have been marked as dead are not included.
|
- Keys that have been marked as dead are not included.
|
||||||
-}
|
-}
|
||||||
loggedKeys :: Annex [Unchecked Key]
|
loggedKeys :: Annex ([Unchecked Key], IO Bool)
|
||||||
loggedKeys = loggedKeys' (not <$$> checkDead)
|
loggedKeys = loggedKeys' (not <$$> checkDead)
|
||||||
|
|
||||||
loggedKeys' :: (Key -> Annex Bool) -> Annex [Unchecked Key]
|
loggedKeys' :: (Key -> Annex Bool) -> Annex ([Unchecked Key], IO Bool)
|
||||||
loggedKeys' check = do
|
loggedKeys' check = do
|
||||||
config <- Annex.getGitConfig
|
config <- Annex.getGitConfig
|
||||||
mapMaybe (defercheck <$$> locationLogFileKey config)
|
(bfs, cleanup) <- Annex.Branch.files
|
||||||
<$> Annex.Branch.files
|
let l = mapMaybe (defercheck <$$> locationLogFileKey config) bfs
|
||||||
|
return (l, cleanup)
|
||||||
where
|
where
|
||||||
defercheck k = Unchecked $ ifM (check k)
|
defercheck k = Unchecked $ ifM (check k)
|
||||||
( return (Just k)
|
( return (Just k)
|
||||||
|
@ -146,9 +147,13 @@ loggedKeys' check = do
|
||||||
- This does not stream well; use loggedKeysFor' for lazy streaming.
|
- This does not stream well; use loggedKeysFor' for lazy streaming.
|
||||||
-}
|
-}
|
||||||
loggedKeysFor :: UUID -> Annex [Key]
|
loggedKeysFor :: UUID -> Annex [Key]
|
||||||
loggedKeysFor u = catMaybes <$> (mapM finishCheck =<< loggedKeysFor' u)
|
loggedKeysFor u = do
|
||||||
|
(l, cleanup) <- loggedKeysFor' u
|
||||||
|
l' <- catMaybes <$> mapM finishCheck l
|
||||||
|
liftIO $ void cleanup
|
||||||
|
return l'
|
||||||
|
|
||||||
loggedKeysFor' :: UUID -> Annex [Unchecked Key]
|
loggedKeysFor' :: UUID -> Annex ([Unchecked Key], IO Bool)
|
||||||
loggedKeysFor' u = loggedKeys' isthere
|
loggedKeysFor' u = loggedKeys' isthere
|
||||||
where
|
where
|
||||||
isthere k = do
|
isthere k = do
|
||||||
|
|
Loading…
Reference in a new issue