[PATCH] Asynchronous close event handling for single peer upstreams

J Carter jordanc.carter at outlook.com
Fri May 12 00:11:34 UTC 2023


On Sun, 7 May 2023 21:55:19 +0100
J Carter <jordanc.carter at outlook.com> wrote:

> # HG changeset patch
> # User jordanc.carter at outlook.com
> # Date 1683491710 -3600
> #      Sun May 07 21:35:10 2023 +0100
> # Node ID e1ec9971da677b763c7576c729576d6f906631ae
> # Parent  b71e69247483631bd8fc79a47cc32b762625b1fb
> Asynchronous close event handling for single peer upstreams
> 
> Prevents additional upstream tries when consecutive asynchronous close
> errors are encountered for single peer upstreams utilizing keepalive
> connections.
> 
> This replaces the current behavior of unlimited retries.
> 
> diff -r b71e69247483 -r e1ec9971da67 src/event/ngx_event_connect.h
> --- a/src/event/ngx_event_connect.h	Mon May 01 19:16:05 2023
> +0400 +++ b/src/event/ngx_event_connect.h	Sun May 07 21:35:10
> 2023 +0100 @@ -17,6 +17,7 @@
>  #define NGX_PEER_KEEPALIVE           1
>  #define NGX_PEER_NEXT                2
>  #define NGX_PEER_FAILED              4
> +#define NGX_PEER_ASYNC_FAILED        8
>  
>  
>  typedef struct ngx_peer_connection_s  ngx_peer_connection_t;
> @@ -64,6 +65,7 @@
>      unsigned                         transparent:1;
>      unsigned                         so_keepalive:1;
>      unsigned                         down:1;
> +    unsigned                         async_failed:1;
>  
>                                       /* ngx_connection_log_error_e */
>      unsigned                         log_error:2;
> diff -r b71e69247483 -r e1ec9971da67 src/http/ngx_http_upstream.c
> --- a/src/http/ngx_http_upstream.c	Mon May 01 19:16:05 2023
> +0400 +++ b/src/http/ngx_http_upstream.c	Sun May 07 21:35:10
> 2023 +0100 @@ -4317,6 +4317,9 @@
>          {
>              state = NGX_PEER_NEXT;
>  
> +        } else if (u->peer.cached && ft_type ==
> NGX_HTTP_UPSTREAM_FT_ERROR) {
> +            state = NGX_PEER_FAILED | NGX_PEER_ASYNC_FAILED;
> +
>          } else {
>              state = NGX_PEER_FAILED;
>          }
> @@ -4330,11 +4333,6 @@
>                        "upstream timed out");
>      }
>  
> -    if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {
> -        /* TODO: inform balancer instead */
> -        u->peer.tries++;
> -    }
> -
>      switch (ft_type) {
>  
>      case NGX_HTTP_UPSTREAM_FT_TIMEOUT:
> diff -r b71e69247483 -r e1ec9971da67
> src/http/ngx_http_upstream_round_robin.c ---
> a/src/http/ngx_http_upstream_round_robin.c	Mon May 01 19:16:05
> 2023 +0400 +++ b/src/http/ngx_http_upstream_round_robin.c	Sun
> May 07 21:35:10 2023 +0100 @@ -623,6 +623,12 @@
> ngx_http_upstream_rr_peers_unlock(rrp->peers); 
>          pc->tries = 0;
> +
> +        if (state & NGX_PEER_ASYNC_FAILED && !pc->async_failed) {
> +            pc->async_failed = 1;
> +            pc->tries = 1;
> +        }
> +
>          return;
>      }

Hello, 

any opinions or suggestions for this patch?


More information about the nginx-devel mailing list