Re: [PATCH 2/2] xwrite: poll on non-blocking FDs
- From
Jeff King <peff@peff.net>
- Date
- Jun 26, 2016, 23:49 UTC
- Message-ID
- <20160626234925.GB21668@sigill.intra.peff.net>
- In-Reply-To
- <20160626232112.721-3-e@80x24.org>
On Sun, Jun 26, 2016 at 11:21:12PM +0000, Eric Wong wrote:
Show 17 quoted lines
> write(2) can hit the same EAGAIN/EWOULDBLOCK errors as read(2),
> so busy-looping on a non-blocking FD is a waste of resources.
>
> Currently, I do not know of a way for this happen:
>
> * the NonBlocking directive in systemd does not apply to stdin,
> stdout, or stderr.
>
> * xinetd provides no way to set the non-blocking flag at all
>
> But theoretically, it's possible a careless C10K HTTP server
> could use pipe2(..., O_NONBLOCK) to setup a pipe for
> git-http-backend with only the intent to use non-blocking reads;
> but accidentally leave non-blocking set on the write end passed
> as stdout to git-upload-pack.
>
> Followup-to: 1079c4be0b720 ("xread: poll on non blocking fds")I think this is sensible. I don't know of a way for it to happen either, but who knows what environments people will spawn git in (especially http-backend, as we are at the mercy of the webserver).
So it's a good defensive measure, it shouldn't affect normal use at all (because blocking descriptors would never return EAGAIN), and it can't possibly hurt anybody expecting to use xwrite() non-blockingly to get EAGAIN (because we already spin on it; this just converts the spin to a poll).
-Peff