Dealing with buffered data with upstream generated response
Maxim Dounin
mdounin at mdounin.ru
Tue Nov 29 18:30:32 UTC 2011
Hello!
On Mon, Nov 28, 2011 at 11:52:38AM -0500, Umesh Sirsiwal wrote:
> I am developing a body filter which transforms outgoing stream. As
> part of the function, the incoming stream is copied in new buffer
> and sent. This in some cases results in a condition where my filter
> has busy buffers but the upper layers don't have any busy buffer. In
> our case the data is generated by upstream module. Since upstream
> module does not pay attention to connection->buffered, the
> output_filter is never called again to flush my busy buffers and the
> transfer just hangs.
>
> Adding r->connection->buffered to the or condition solves the hang.
>
> if (u->out_bufs || u->busy_bufs) {
> rc = ngx_http_output_filter(r, u->out_bufs);
>
> if (rc == NGX_ERROR) {
> ngx_http_upstream_finalize_request(r, u, 0);
> return;
> }
>
> ngx_chain_update_chains(&u->free_bufs, &u->busy_bufs,
> &u->out_bufs, u->output.tag);
> }
>
> Is this nginx bug or am I missing something?
I tend to think this is a bug, and it should probably manifest
itself with e.g. gzip filter as well.
(Well, as far as I see transfer shouldn't hang completely, but it
will be only resumed as soon as upstream sends some more data or
closes connection.)
It would be superb if you'll be able to provide test case which
catches this for our test suite (http://mdounin.ru/hg/nginx-tests).
I'll look into this more closely as time permits.
Maxim Dounin
More information about the nginx
mailing list