[PATCH] ngx_gzip might hang the request for slow downstreams
Yichun Zhang (agentzh)
agentzh at gmail.com
Sun Oct 27 00:16:38 UTC 2013
Hello!
On Sat, Oct 26, 2013 at 2:40 PM, Maxim Dounin wrote:
>
> 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).
>
Yeah, I was thinking along this line too ;)
> 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.
>
Thank you for the suggestions! How about the following patch?
Regards,
-agentzh
--- nginx-1.4.3/src/http/modules/ngx_http_gzip_filter_module.c
2013-10-08 05:07:14.000000000 -0700
+++ nginx-1.4.3-patched/src/http/modules/ngx_http_gzip_filter_module.c
2013-10-26 17:14:22.132109569 -0700
@@ -370,11 +370,12 @@ ngx_http_gzip_body_filter(ngx_http_reque
}
}
- if (ctx->nomem) {
+ if (ctx->nomem || in == NULL) {
/* flush busy buffers */
- if (ngx_http_next_body_filter(r, NULL) == NGX_ERROR) {
+ rc = ngx_http_next_body_filter(r, NULL);
+ if (rc == NGX_ERROR) {
goto failed;
}
@@ -383,6 +384,10 @@ ngx_http_gzip_body_filter(ngx_http_reque
ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &cl,
(ngx_buf_tag_t) &ngx_http_gzip_filter_module);
ctx->nomem = 0;
+
+ if (in == NULL) {
+ return rc;
+ }
}
for ( ;; ) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: nginx-1.4.3-gzip_flush_bug.patch
Type: text/x-patch
Size: 901 bytes
Desc: not available
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20131026/d6657bcc/attachment.bin>
More information about the nginx-devel
mailing list