Page MenuHomePhabricator

Work around broken PHP fwrite() on nonblocking pipes
ClosedPublic

Authored by epriestley on Dec 9 2013, 4:35 PM.
Tags
None
Referenced Files
F18180130: D7748.id17515.diff
Sat, Aug 16, 5:29 AM
F18091610: D7748.id17516.diff
Wed, Aug 6, 11:53 PM
F18081891: D7748.id17521.diff
Tue, Aug 5, 2:38 AM
F17944681: D7748.id.diff
Thu, Jul 31, 10:48 AM
F17925549: D7748.diff
Wed, Jul 30, 11:42 AM
F17868657: D7748.id17515.diff
Jul 28 2025, 8:14 AM
F17656979: D7748.diff
Jul 12 2025, 11:51 AM
Unknown Object (File)
Jul 3 2025, 12:58 PM
Subscribers

Details

Summary

Fixes T4219. See comments. PHP returns 0 when writing to nonblocking pipes for both "everything is OK, but this pipe is blocked, so you should wait a little bit and try again" and "nothing is OK, this pipe is broken forever".

This was causing an busy loop in ssh-exec, where it would check if stderr was writable, see it was, try to write to it, get a 0-length write, interpret that as "wait a bit", wait for it to become writable (i.e., immediately!), try to write again, etc.

This was the best workaround I could come up with. I think it should be pretty safe; I'm not aware of any temporary condition or event which can make a pipe unwritable after a select says it's writable other than a write.

Test Plan

Ran git pull a bunch of times and ^C'd it partway through. Previously I could leave a busy process eating a CPU on the server about 50% of the time, depending how good my timing was. I can no longer generate these processes.

Diff Detail

Lint
Lint Skipped
Unit
Tests Skipped