Added a comment
authorkyle <kyle@web>
Mon, 10 Aug 2020 21:34:46 +0000 (21:34 +0000)
committeradmin <admin@branchable.com>
Mon, 10 Aug 2020 21:34:46 +0000 (21:34 +0000)
doc/bugs/Recent_hang_with_rsync_remote_with_older_systems___40__Xenial__44___Jessie__41__/comment_16_b2d1550e20e8c4cc07dbd0ebba64c603._comment [new file with mode: 0644]

diff --git a/doc/bugs/Recent_hang_with_rsync_remote_with_older_systems___40__Xenial__44___Jessie__41__/comment_16_b2d1550e20e8c4cc07dbd0ebba64c603._comment b/doc/bugs/Recent_hang_with_rsync_remote_with_older_systems___40__Xenial__44___Jessie__41__/comment_16_b2d1550e20e8c4cc07dbd0ebba64c603._comment
new file mode 100644 (file)
index 0000000..30813e6
--- /dev/null
@@ -0,0 +1,78 @@
+[[!comment format=mdwn
+ username="kyle"
+ avatar="http://cdn.libravatar.org/avatar/7d6e85cde1422ad60607c87fa87c63f3"
+ subject="comment 16"
+ date="2020-08-10T21:34:43Z"
+ content="""
+I applied the change from c59a51a0651b and 4466c1001d88.  Now I don't
+see \"git-annex: AsyncCancelled\", f0 is transferred, and the exit
+status is 0, so it looks to be working as intended.  Thank you.
+
+As described in comment 8, this is all in the Xenial VM on top of
+1df9e72a7829, because the hang goes away with the next commit
+(4c9ad1de46dd).  For posterity, here is a diff of the changes on top
+1df9e72a7829, applied from aa492bc65904, c59a51a0651b, and
+4466c1001d88.
+
+<details>
+<summary>diff</summary>
+
+[[!format diff \"\"\"
+diff --git a/Utility/Metered.hs b/Utility/Metered.hs
+index 1c35a9a05..c4063c90b 100644
+--- a/Utility/Metered.hs
++++ b/Utility/Metered.hs
+@@ -1,6 +1,6 @@
+ {- Metered IO and actions
+  -
+- - Copyright 2012-2018 Joey Hess <id@joeyh.name>
++ - Copyright 2012-2020 Joey Hess <id@joeyh.name>
+  -
+  - License: BSD-2-clause
+  -}
+@@ -46,6 +46,7 @@ import Common
+ import Utility.Percentage
+ import Utility.DataUnits
+ import Utility.HumanTime
++import Utility.ThreadScheduler
+ import qualified Data.ByteString.Lazy as L
+ import qualified Data.ByteString as S
+@@ -314,10 +315,26 @@ 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
++              outt <- async $ tryIO (outfilter outh) >> hClose outh
++              errt <- async $ tryIO (errfilter errh) >> hClose errh
++              ret <- waitForProcess pid
++
++              -- Normally, now that the process has exited, the threads
++              -- will finish processing its output and terminate.
++              -- But, just in case the process did something evil like
++              -- forking to the background while inheriting stderr,
++              -- it's possible that the threads will not finish, which
++              -- would result in a deadlock. So, wait a few seconds
++              -- maximum for them to finish and then cancel them.
++              -- (One program that has behaved this way in the past is
++              -- openssh.)
++              void $ tryNonAsync $ race_
++                      (wait outt >> wait errt)
++                      (threadDelaySeconds (Seconds 2))
++              cancel outt
++              cancel errt
++
++              return ret
+       go _ _ _ _ = error \"internal\"
+       
+       p = (proc cmd (toCommand params))
+\"\"\"]]
+
+</details>
+
+
+
+"""]]