Upstream: excluded down servers from the next_upstream tries.

Previously, the number of next_upstream tries included servers marked
as "down", resulting in "no live upstreams" with the code 502 instead
of the code derived from an attempt to connect to the last tried "up"
server (ticket #2096).
This commit is contained in:
Ruslan Ermilov 2020-11-27 00:01:20 +03:00
parent afd0a08e17
commit e8a65f3b5b
4 changed files with 36 additions and 6 deletions

View File

@ -10,8 +10,8 @@
#include <ngx_http.h>
#define ngx_http_upstream_tries(p) ((p)->number \
+ ((p)->next ? (p)->next->number : 0))
#define ngx_http_upstream_tries(p) ((p)->tries \
+ ((p)->next ? (p)->next->tries : 0))
static ngx_http_upstream_rr_peer_t *ngx_http_upstream_get_peer(
@ -32,7 +32,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
ngx_http_upstream_srv_conf_t *us)
{
ngx_url_t u;
ngx_uint_t i, j, n, w;
ngx_uint_t i, j, n, w, t;
ngx_http_upstream_server_t *server;
ngx_http_upstream_rr_peer_t *peer, **peerp;
ngx_http_upstream_rr_peers_t *peers, *backup;
@ -44,6 +44,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
n = 0;
w = 0;
t = 0;
for (i = 0; i < us->servers->nelts; i++) {
if (server[i].backup) {
@ -52,6 +53,10 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
n += server[i].naddrs;
w += server[i].naddrs * server[i].weight;
if (!server[i].down) {
t += server[i].naddrs;
}
}
if (n == 0) {
@ -75,6 +80,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
peers->number = n;
peers->weighted = (w != n);
peers->total_weight = w;
peers->tries = t;
peers->name = &us->host;
n = 0;
@ -110,6 +116,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
n = 0;
w = 0;
t = 0;
for (i = 0; i < us->servers->nelts; i++) {
if (!server[i].backup) {
@ -118,6 +125,10 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
n += server[i].naddrs;
w += server[i].naddrs * server[i].weight;
if (!server[i].down) {
t += server[i].naddrs;
}
}
if (n == 0) {
@ -139,6 +150,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
backup->number = n;
backup->weighted = (w != n);
backup->total_weight = w;
backup->tries = t;
backup->name = &us->host;
n = 0;
@ -214,6 +226,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
peers->number = n;
peers->weighted = 0;
peers->total_weight = n;
peers->tries = n;
peers->name = &us->host;
peerp = &peers->peer;
@ -332,6 +345,7 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
peers->single = (ur->naddrs == 1);
peers->number = ur->naddrs;
peers->tries = ur->naddrs;
peers->name = &ur->host;
if (ur->sockaddr) {

View File

@ -68,6 +68,7 @@ struct ngx_http_upstream_rr_peers_s {
#endif
ngx_uint_t total_weight;
ngx_uint_t tries;
unsigned single:1;
unsigned weighted:1;

View File

@ -10,8 +10,8 @@
#include <ngx_stream.h>
#define ngx_stream_upstream_tries(p) ((p)->number \
+ ((p)->next ? (p)->next->number : 0))
#define ngx_stream_upstream_tries(p) ((p)->tries \
+ ((p)->next ? (p)->next->tries : 0))
static ngx_stream_upstream_rr_peer_t *ngx_stream_upstream_get_peer(
@ -38,7 +38,7 @@ ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,
ngx_stream_upstream_srv_conf_t *us)
{
ngx_url_t u;
ngx_uint_t i, j, n, w;
ngx_uint_t i, j, n, w, t;
ngx_stream_upstream_server_t *server;
ngx_stream_upstream_rr_peer_t *peer, **peerp;
ngx_stream_upstream_rr_peers_t *peers, *backup;
@ -50,6 +50,7 @@ ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,
n = 0;
w = 0;
t = 0;
for (i = 0; i < us->servers->nelts; i++) {
if (server[i].backup) {
@ -58,6 +59,10 @@ ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,
n += server[i].naddrs;
w += server[i].naddrs * server[i].weight;
if (!server[i].down) {
t += server[i].naddrs;
}
}
if (n == 0) {
@ -81,6 +86,7 @@ ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,
peers->number = n;
peers->weighted = (w != n);
peers->total_weight = w;
peers->tries = t;
peers->name = &us->host;
n = 0;
@ -116,6 +122,7 @@ ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,
n = 0;
w = 0;
t = 0;
for (i = 0; i < us->servers->nelts; i++) {
if (!server[i].backup) {
@ -124,6 +131,10 @@ ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,
n += server[i].naddrs;
w += server[i].naddrs * server[i].weight;
if (!server[i].down) {
t += server[i].naddrs;
}
}
if (n == 0) {
@ -145,6 +156,7 @@ ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,
backup->number = n;
backup->weighted = (w != n);
backup->total_weight = w;
backup->tries = t;
backup->name = &us->host;
n = 0;
@ -220,6 +232,7 @@ ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,
peers->number = n;
peers->weighted = 0;
peers->total_weight = n;
peers->tries = n;
peers->name = &us->host;
peerp = &peers->peer;
@ -342,6 +355,7 @@ ngx_stream_upstream_create_round_robin_peer(ngx_stream_session_t *s,
peers->single = (ur->naddrs == 1);
peers->number = ur->naddrs;
peers->tries = ur->naddrs;
peers->name = &ur->host;
if (ur->sockaddr) {

View File

@ -66,6 +66,7 @@ struct ngx_stream_upstream_rr_peers_s {
#endif
ngx_uint_t total_weight;
ngx_uint_t tries;
unsigned single:1;
unsigned weighted:1;