[PATCH 0/2] fix http deadlock on giant ref negotiations
- From
Jeff King <peff@peff.net>
- Date
- May 15, 2015, 06:29 UTC
- Message-ID
- <20150515062901.GA30768@peff.net>
- In-Reply-To
- <20150514004724.GA3059@peff.net>
On Wed, May 13, 2015 at 08:47:24PM -0400, Jeff King wrote:
Show 5 quoted lines
> The fundamental problem is the deadlock on the server side, which is > producing bogus protocol output. And that's a mismatch between what > Apache expects (that the CGI will read all of the input request and then > generate an output request) and what the CGI wants to do (stream output > as it reads the input).
At first I was irritated with Apache for this. But thinking on it more, it's really due to our shoe-horning of a full-duplex protocol into the half-duplex HTTP protocol. Even if we could convince Apache to work in a full-duplex way here, and even if our client is full-duplex (since otherwise we are just trading pipe buffers for TCP buffers), we still may face arbitrary HTTP proxies or other infrastructure in the middle.
So here's a series to try to address the issue. The first patch is a fixed version of the die-recursion fixup I posted earlier. The second is the interesting one.
[1/2]: http-backend: fix die recursion with custom handler [2/2]: http-backend: spool ref negotiation requests to buffer
I have no clue how to write a test that would trigger this reliably without requiring a gigantic test fixture. However, I did confirm that it fixes the problem on the chromium case you provided (which otherwise deadlocks reliably for me).
-Peff