From 632137836b39462883483a621f9dd696ce1d73cc Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 13 Jul 2017 11:04:14 -0400 Subject: disable buffering earlier The "fatal: Couldn't find remote ref HEAD" persists, and is intermittent so hard to be sure but it seemed that disabling buffering earlier avoided it. Now done first thing on start. I was not able to find anything that reads from stdin other than getMarked, but perhaps there is something.. --- src/Propellor/CmdLine.hs | 1 + src/Propellor/Protocol.hs | 6 +----- src/Propellor/Spin.hs | 13 ++++++++++--- 3 files changed, 12 insertions(+), 8 deletions(-) (limited to 'src/Propellor') diff --git a/src/Propellor/CmdLine.hs b/src/Propellor/CmdLine.hs index a36ec7f5..70bb0bf8 100644 --- a/src/Propellor/CmdLine.hs +++ b/src/Propellor/CmdLine.hs @@ -111,6 +111,7 @@ data CanRebuild = CanRebuild | NoRebuild defaultMain :: [Host] -> IO () defaultMain hostlist = withConcurrentOutput $ do useFileSystemEncoding + updatePrepare Shim.cleanEnv checkDebugMode cmdline <- processCmdLine diff --git a/src/Propellor/Protocol.hs b/src/Propellor/Protocol.hs index ae7e0404..bc8d9327 100644 --- a/src/Propellor/Protocol.hs +++ b/src/Propellor/Protocol.hs @@ -53,11 +53,7 @@ sendMarked' h marker s = do hFlush h getMarked :: Handle -> Marker -> IO (Maybe String) -getMarked h marker = do - -- Avoid buffering anything in Handle, so that the data after - -- the marker will be available to be read from the underlying Fd. - hSetBuffering stdin NoBuffering - go =<< catchMaybeIO (hGetLine h) +getMarked h marker = go =<< catchMaybeIO (hGetLine h) where go Nothing = return Nothing go (Just l) = case fromMarked marker l of diff --git a/src/Propellor/Spin.hs b/src/Propellor/Spin.hs index 7146ad4c..732ec9b7 100644 --- a/src/Propellor/Spin.hs +++ b/src/Propellor/Spin.hs @@ -5,6 +5,7 @@ module Propellor.Spin ( spin, spin', update, + updatePrepare, gitPushHelper, mergeSpin, ) where @@ -349,14 +350,20 @@ findLastNonSpinCommit = do spinCommitMessage :: String spinCommitMessage = "propellor spin" +-- Avoid buffering anything read from stdin, so that +-- when gitPullFromUpdateServer runs git fetch, it sees all the data +-- it expects to. +-- +-- Should be called very early in propellor start, before anything reads +-- from stdin. +updatePrepare :: IO () +updatePrepare = hSetBuffering stdin NoBuffering + -- Stdin and stdout are connected to the updateServer over ssh. -- Request that it run git upload-pack, and connect that up to a git fetch -- to receive the data. gitPullFromUpdateServer :: IO () gitPullFromUpdateServer = reqMarked NeedGitPush gitPushMarker $ \_ -> do - -- Note that this relies on data not being buffered in the stdin - -- Handle, since such buffered data would not be available in the - -- FD passed to git fetch. hin <- dup stdInput hout <- dup stdOutput hClose stdin -- cgit v1.2.3