summaryrefslogtreecommitdiff
path: root/Git
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-05-31 12:20:17 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-05-31 12:42:13 -0400
commited73317dbdd1d822b1fbb15b249a330e453e6293 (patch)
treed3c792719b01583e2cc21a9a66f44a26a1d61bed /Git
parent8ca051c47ed0d326588ffb84203b4dc390b611cb (diff)
Can now restart certain long-running git processes if they crash, and continue working.
Fuzz tests have shown that git cat-file --batch sometimes stops running. It's not yet known why (no error message; repo seems ok). But this is something we can deal with in the CoProcess framework, since all 3 types of long-running git processes should be restartable if they fail. Note that, as implemented, only IO errors are caught. So an error thrown by the reveiver, when it sees something that is not valid output from git cat-file (etc) will not cause a restart. I don't want it to retry if git commands change their output or are just outputting garbage. This does mean that if the command did a partial output and crashed in the middle, it would still not be restarted. There is currently no guard against restarting a command repeatedly, if, for example, it crashes repeatedly on startup.
Diffstat (limited to 'Git')
-rw-r--r--Git/CatFile.hs2
-rw-r--r--Git/CheckAttr.hs2
-rw-r--r--Git/Command.hs6
-rw-r--r--Git/HashObject.hs2
4 files changed, 7 insertions, 5 deletions
diff --git a/Git/CatFile.hs b/Git/CatFile.hs
index 5ab10b187..d95972393 100644
--- a/Git/CatFile.hs
+++ b/Git/CatFile.hs
@@ -29,7 +29,7 @@ import qualified Utility.CoProcess as CoProcess
type CatFileHandle = CoProcess.CoProcessHandle
catFileStart :: Repo -> IO CatFileHandle
-catFileStart = CoProcess.rawMode <=< gitCoProcessStart
+catFileStart = CoProcess.rawMode <=< gitCoProcessStart True
[ Param "cat-file"
, Param "--batch"
]
diff --git a/Git/CheckAttr.hs b/Git/CheckAttr.hs
index b3055fd4c..0bf6a3931 100644
--- a/Git/CheckAttr.hs
+++ b/Git/CheckAttr.hs
@@ -22,7 +22,7 @@ type Attr = String
checkAttrStart :: [Attr] -> Repo -> IO CheckAttrHandle
checkAttrStart attrs repo = do
cwd <- getCurrentDirectory
- h <- CoProcess.rawMode =<< gitCoProcessStart params repo
+ h <- CoProcess.rawMode =<< gitCoProcessStart True params repo
return (h, attrs, cwd)
where
params =
diff --git a/Git/Command.hs b/Git/Command.hs
index e6cec16fb..648da985b 100644
--- a/Git/Command.hs
+++ b/Git/Command.hs
@@ -109,8 +109,10 @@ leaveZombie :: (a, IO Bool) -> a
leaveZombie = fst
{- Runs a git command as a coprocess. -}
-gitCoProcessStart :: [CommandParam] -> Repo -> IO CoProcess.CoProcessHandle
-gitCoProcessStart params repo = CoProcess.start "git" (toCommand $ gitCommandLine params repo) (gitEnv repo)
+gitCoProcessStart :: Bool -> [CommandParam] -> Repo -> IO CoProcess.CoProcessHandle
+gitCoProcessStart restartable params repo = CoProcess.start restartable "git"
+ (toCommand $ gitCommandLine params repo)
+ (gitEnv repo)
gitCreateProcess :: [CommandParam] -> Repo -> CreateProcess
gitCreateProcess params repo =
diff --git a/Git/HashObject.hs b/Git/HashObject.hs
index bf3ca7f8b..1991ea4a5 100644
--- a/Git/HashObject.hs
+++ b/Git/HashObject.hs
@@ -17,7 +17,7 @@ import qualified Utility.CoProcess as CoProcess
type HashObjectHandle = CoProcess.CoProcessHandle
hashObjectStart :: Repo -> IO HashObjectHandle
-hashObjectStart = CoProcess.rawMode <=< gitCoProcessStart
+hashObjectStart = CoProcess.rawMode <=< gitCoProcessStart True
[ Param "hash-object"
, Param "-w"
, Param "--stdin-paths"