Hello, resubmitting with the changes suggested.
# HG changeset patch # User jordanc.car...@outlook.com # Date 1681067934 -3600 # Sun Apr 09 20:18:54 2023 +0100 # Node ID c8dcf584b36505e42bd2ea2965c1020069adb677 # Parent 5f1d05a21287ba0290dd3a17ad501595b442a194 Asynchronous close event handling for single peer upstreams Limits single peer upstreams to a single retry when consecutive asynchronous close events are encountered. diff -r 5f1d05a21287 -r c8dcf584b365 src/event/ngx_event_connect.h --- a/src/event/ngx_event_connect.h Tue Mar 28 18:01:54 2023 +0300 +++ b/src/event/ngx_event_connect.h Sun Apr 09 20:18:54 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 5f1d05a21287 -r c8dcf584b365 src/http/ngx_http_upstream.c --- a/src/http/ngx_http_upstream.c Tue Mar 28 18:01:54 2023 +0300 +++ b/src/http/ngx_http_upstream.c Sun Apr 09 20:18:54 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: @@ -4421,7 +4419,6 @@ return; } #endif - ngx_http_upstream_finalize_request(r, u, status); return; } diff -r 5f1d05a21287 -r c8dcf584b365 src/http/ngx_http_upstream_round_robin.c --- a/src/http/ngx_http_upstream_round_robin.c Tue Mar 28 18:01:54 2023 +0300 +++ b/src/http/ngx_http_upstream_round_robin.c Sun Apr 09 20:18:54 2023 +0100 @@ -616,14 +616,14 @@ ngx_http_upstream_rr_peer_lock(rrp->peers, peer); if (rrp->peers->single) { - - peer->conns--; + pc->tries = 0; - ngx_http_upstream_rr_peer_unlock(rrp->peers, peer); - ngx_http_upstream_rr_peers_unlock(rrp->peers); + if (state & NGX_PEER_ASYNC_FAILED && pc->async_failed == 0) { + pc->tries = 2; + pc->async_failed = 1; + } - pc->tries = 0; - return; + goto cleanup; } if (state & NGX_PEER_FAILED) { @@ -659,6 +659,7 @@ } } + cleanup: peer->conns--; ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);
hgexport
Description: Binary data
_______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel