diff options
-rw-r--r-- | Git/Command.hs | 7 | ||||
-rw-r--r-- | Utility/CoProcess.hs | 13 | ||||
-rw-r--r-- | debian/changelog | 2 | ||||
-rw-r--r-- | doc/bugs/endless_loop_when_PWD_gone.mdwn | 2 |
4 files changed, 17 insertions, 7 deletions
diff --git a/Git/Command.hs b/Git/Command.hs index adcc53bcd..4c338ba25 100644 --- a/Git/Command.hs +++ b/Git/Command.hs @@ -128,9 +128,14 @@ leaveZombie = fst {- Runs a git command as a coprocess. -} gitCoProcessStart :: Bool -> [CommandParam] -> Repo -> IO CoProcess.CoProcessHandle -gitCoProcessStart restartable params repo = CoProcess.start restartable "git" +gitCoProcessStart restartable params repo = CoProcess.start numrestarts "git" (toCommand $ gitCommandLine params repo) (gitEnv repo) + where + {- If a long-running git command like cat-file --batch + - crashes, it will likely start up again ok. If it keeps crashing + - 10 times, something is badly wrong. -} + numrestarts = if restartable then 10 else 0 gitCreateProcess :: [CommandParam] -> Repo -> CreateProcess gitCreateProcess params repo = diff --git a/Utility/CoProcess.hs b/Utility/CoProcess.hs index 710d2af13..c1134011b 100644 --- a/Utility/CoProcess.hs +++ b/Utility/CoProcess.hs @@ -30,15 +30,15 @@ data CoProcessState = CoProcessState } data CoProcessSpec = CoProcessSpec - { coProcessRestartable :: Bool + { coProcessNumRestarts :: Int , coProcessCmd :: FilePath , coProcessParams :: [String] , coProcessEnv :: Maybe [(String, String)] } -start :: Bool -> FilePath -> [String] -> Maybe [(String, String)] -> IO CoProcessHandle -start restartable cmd params env = do - s <- start' $ CoProcessSpec restartable cmd params env +start :: Int -> FilePath -> [String] -> Maybe [(String, String)] -> IO CoProcessHandle +start numrestarts cmd params env = do + s <- start' $ CoProcessSpec numrestarts cmd params env newMVar s start' :: CoProcessSpec -> IO CoProcessState @@ -66,7 +66,7 @@ query ch send receive = do return where restartable s a cont - | coProcessRestartable (coProcessSpec s) = + | coProcessNumRestarts (coProcessSpec s) > 0 = maybe restart cont =<< catchMaybeIO a | otherwise = cont =<< a restart = do @@ -75,7 +75,8 @@ query ch send receive = do hClose $ coProcessTo s hClose $ coProcessFrom s void $ waitForProcess $ coProcessPid s - s' <- start' (coProcessSpec s) + s' <- start' $ (coProcessSpec s) + { coProcessNumRestarts = coProcessNumRestarts (coProcessSpec s) - 1 } putMVar ch s' query ch send receive diff --git a/debian/changelog b/debian/changelog index 69b4f98a8..28090c450 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,8 @@ git-annex (5.20131231) UNRELEASED; urgency=medium in subdirectories to go missing. * Windows: Avoid eating stdin when running ssh to add a authorized key, since this is used for password prompting. + * Avoid looping if long-running git cat-file or git hash-object crashes + and keeps crashing when restarted. -- Joey Hess <joeyh@debian.org> Tue, 31 Dec 2013 13:41:18 -0400 diff --git a/doc/bugs/endless_loop_when_PWD_gone.mdwn b/doc/bugs/endless_loop_when_PWD_gone.mdwn index 16eaadfcf..2df9e9c14 100644 --- a/doc/bugs/endless_loop_when_PWD_gone.mdwn +++ b/doc/bugs/endless_loop_when_PWD_gone.mdwn @@ -12,3 +12,5 @@ This results in git-annex entering an endless loop: fatal: Unable to read current working directory: No such file or directory fatal: Unable to read current working directory: No such file or directory fatal: Unable to read current working directory: No such file or directory + +> [[fixed|done]] --[[Joey]] |