[PATCH] Output chain: propagate flush and last_buf flags to send_chain()

Maxim Dounin mdounin at mdounin.ru
Thu Jun 8 16:29:56 UTC 2017


Hello!

On Sat, Jun 03, 2017 at 08:04:07PM -0700, Piotr Sikora via nginx-devel wrote:

> # HG changeset patch
> # User Piotr Sikora <piotrsikora at google.com>
> # Date 1491708381 25200
> #      Sat Apr 08 20:26:21 2017 -0700
> # Node ID 2a48b9b6e67d91594c1787ebf721daebf5f88c91
> # Parent  716852cce9136d977b81a2d1b8b6f9fbca0dce49
> Output chain: propagate flush and last_buf flags to send_chain().
> 
> Signed-off-by: Piotr Sikora <piotrsikora at google.com>
> 
> diff -r 716852cce913 -r 2a48b9b6e67d src/core/ngx_output_chain.c
> --- a/src/core/ngx_output_chain.c
> +++ b/src/core/ngx_output_chain.c
> @@ -658,6 +658,7 @@ ngx_chain_writer(void *data, ngx_chain_t
>      ngx_chain_writer_ctx_t *ctx = data;
>  
>      off_t              size;
> +    ngx_uint_t         flush;
>      ngx_chain_t       *cl, *ln, *chain;
>      ngx_connection_t  *c;
>  
> @@ -689,9 +690,10 @@ ngx_chain_writer(void *data, ngx_chain_t
>  
>          size += ngx_buf_size(in->buf);
>  
> -        ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0,
> -                       "chain writer buf fl:%d s:%uO",
> -                       in->buf->flush, ngx_buf_size(in->buf));
> +        ngx_log_debug3(NGX_LOG_DEBUG_CORE, c->log, 0,
> +                       "chain writer buf fl:%d l:%d s:%uO",
> +                       in->buf->flush, in->buf->last_buf,
> +                       ngx_buf_size(in->buf));
>  
>          cl = ngx_alloc_chain_link(ctx->pool);
>          if (cl == NULL) {
> @@ -707,6 +709,8 @@ ngx_chain_writer(void *data, ngx_chain_t
>      ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
>                     "chain writer in: %p", ctx->out);
>  
> +    flush = 0;
> +
>      for (cl = ctx->out; cl; cl = cl->next) {
>  
>  #if 1
> @@ -732,9 +736,13 @@ ngx_chain_writer(void *data, ngx_chain_t
>  #endif
>  
>          size += ngx_buf_size(cl->buf);
> +
> +        if (cl->buf->flush || cl->buf->last_buf) {
> +            flush = 1;
> +        }
>      }
>  
> -    if (size == 0 && !c->buffered) {
> +    if (size == 0 && !flush && !c->buffered) {
>          return NGX_OK;
>      }

This is not normally needed, especially in case of flush.  If you 
think it is - please clarify how do you expect to use it.

Note well that in HTTP/2-related code the special flag 
c->need_last_buf is used to indicate that a (fake) connection 
needs an information about last_buf, thus allowing HTTP/2 
c->send_chain() wrapper to add its own framing.  If the goal is 
the same, please consider using the same approach.

-- 
Maxim Dounin
http://nginx.org/


More information about the nginx-devel mailing list