[PATCH] ngx_gzip might hang the request for slow downstreams
Maxim Dounin
mdounin at mdounin.ru
Sat Oct 26 21:40:13 UTC 2013
Hello!
On Fri, Oct 25, 2013 at 10:59:44PM -0700, Yichun Zhang (agentzh) wrote:
> Hello!
>
> On Fri, Oct 25, 2013 at 10:55 PM, Yichun Zhang (agentzh) wrote:
> >
> > This is triggered by my own (3rd-party) module, ngx_lua. This module
> > provides a ngx.flush(true) API function that flushes out all pending
> > output data and *wait* (nonblockingly) until all outputs are *indeed*
> > flushed out (into the system socket send buffer):
> >
> > https://github.com/chaoslawful/lua-nginx-module#ngxflush
> >
>
> Sorry, I pressed the mail send button too fast. Below are some more details:
>
> Under the hood, it sends out a special buf with ->flush set and then
> checks the return value of the output filter chain. If it is
> NGX_AGAIN, then wait for the next write event. Upon a new write event,
> call ngx_http_output_filter(r, NULL) to flush out the output and check
> r->connection->buffered to see if there's still any pending data.
>
> Is this the right way to do this? If not, do you have any suggestions?
Well, it would be good to adjust gzip (and other filters) to make
this actually work. And I think something similar may be
triggered using non-buffered proxy, too. Part of a response might
be left in buffers till new data from an upstream is received
(despite the fact that a client is again able to recieve the data,
and non-buffered proxy tries to flush everything as fast as
possible).
I don't think the patch you suggested is correct though. At least
it lacks update chains call. It may also make sense to look at
the "if (ctx->nomem)" codepath, which is very similar and probably
may be adjusted to handle this case as well.
--
Maxim Dounin
http://nginx.org/en/donation.html
More information about the nginx-devel
mailing list