mirror of
https://github.com/nginx/nginx.git
synced 2025-02-25 18:55:26 -06:00
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:
parent
4f7a9ec7a9
commit
cfa669151e
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user