comment
This commit is contained in:
parent
c70ae68d7e
commit
1b2f29b207
1 changed files with 58 additions and 0 deletions
|
@ -0,0 +1,58 @@
|
||||||
|
[[!comment format=mdwn
|
||||||
|
username="joey"
|
||||||
|
subject="""comment 1"""
|
||||||
|
date="2020-07-13T15:53:56Z"
|
||||||
|
content="""
|
||||||
|
Hmm, my guess is that the significant and unmentioned change in that commit
|
||||||
|
is, it waits for one of the stdout or stderr to be fully processed before
|
||||||
|
waiting on the process to terminate. So if it somehow fails to detect EOF
|
||||||
|
(maybe because old rsync and ssh somehow end up with the handle not being
|
||||||
|
closed when rsync exits eg if a background ssh process inherited them?) it
|
||||||
|
would block forever.
|
||||||
|
|
||||||
|
If so, this patch would avoid the hang (and if this doesn't fix it, the
|
||||||
|
problem must be somehow due to using with CreateProcess).
|
||||||
|
|
||||||
|
diff --git a/Utility/Metered.hs b/Utility/Metered.hs
|
||||||
|
index 1c35a9a05..8e363681d 100644
|
||||||
|
--- a/Utility/Metered.hs
|
||||||
|
+++ b/Utility/Metered.hs
|
||||||
|
@@ -314,9 +314,8 @@ outputFilter cmd params environ outfilter errfilter =
|
||||||
|
catchMaybeIO $ withCreateProcess p go
|
||||||
|
where
|
||||||
|
go _ (Just outh) (Just errh) pid = do
|
||||||
|
- void $ concurrently
|
||||||
|
- (tryIO (outfilter outh) >> hClose outh)
|
||||||
|
- (tryIO (errfilter errh) >> hClose errh)
|
||||||
|
+ void $ async $ tryIO (outfilter outh) >> hClose outh
|
||||||
|
+ void $ async $ tryIO (errfilter errh) >> hClose errh
|
||||||
|
waitForProcess pid
|
||||||
|
go _ _ _ _ = error "internal"
|
||||||
|
|
||||||
|
If that patch does avoid the hang, this one would be worth a try
|
||||||
|
as it tries to accomplish the goal of the patch in a better way:
|
||||||
|
|
||||||
|
diff --git a/Utility/Metered.hs b/Utility/Metered.hs
|
||||||
|
index 1c35a9a05..bd265ae09 100644
|
||||||
|
--- a/Utility/Metered.hs
|
||||||
|
+++ b/Utility/Metered.hs
|
||||||
|
@@ -313,11 +313,10 @@ outputFilter
|
||||||
|
outputFilter cmd params environ outfilter errfilter =
|
||||||
|
catchMaybeIO $ withCreateProcess p go
|
||||||
|
where
|
||||||
|
- go _ (Just outh) (Just errh) pid = do
|
||||||
|
- void $ concurrently
|
||||||
|
- (tryIO (outfilter outh) >> hClose outh)
|
||||||
|
- (tryIO (errfilter errh) >> hClose errh)
|
||||||
|
- waitForProcess pid
|
||||||
|
+ go _ (Just outh) (Just errh) pid =
|
||||||
|
+ withAsync (tryIO (outfilter outh) >> hClose outh) $ const $
|
||||||
|
+ withAsync (tryIO (errfilter errh) >> hClose errh) $ const $
|
||||||
|
+ waitForProcess pid
|
||||||
|
go _ _ _ _ = error "internal"
|
||||||
|
|
||||||
|
p = (proc cmd (toCommand params))
|
||||||
|
|
||||||
|
I can try these if necessary but don't have docker handy,
|
||||||
|
so maybe you're in a better position to?
|
||||||
|
"""]]
|
Loading…
Add table
Add a link
Reference in a new issue