[PATCH] Asynchronous close event handling for single peer upstreams

J Carter jordanc.carter at outlook.com
Sun May 7 20:55:19 UTC 2023


# 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;
     }
 


More information about the nginx-devel mailing list