summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Git/Command.hs7
-rw-r--r--Utility/CoProcess.hs13
-rw-r--r--debian/changelog2
-rw-r--r--doc/bugs/endless_loop_when_PWD_gone.mdwn2
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]]