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