Merge branch 'nginx' (nginx-1.11.5).
Change-Id: Ibf23063049785ae9ae115097f83e78bdb65f2898
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
diff --git a/src/http/ngx_http_upstream_round_robin.c b/src/http/ngx_http_upstream_round_robin.c
index 8479c42..6eb0bec 100644
--- a/src/http/ngx_http_upstream_round_robin.c
+++ b/src/http/ngx_http_upstream_round_robin.c
@@ -92,6 +92,7 @@
peer[n].weight = server[i].weight;
peer[n].effective_weight = server[i].weight;
peer[n].current_weight = 0;
+ peer[n].max_conns = server[i].max_conns;
peer[n].max_fails = server[i].max_fails;
peer[n].fail_timeout = server[i].fail_timeout;
peer[n].down = server[i].down;
@@ -155,6 +156,7 @@
peer[n].weight = server[i].weight;
peer[n].effective_weight = server[i].weight;
peer[n].current_weight = 0;
+ peer[n].max_conns = server[i].max_conns;
peer[n].max_fails = server[i].max_fails;
peer[n].fail_timeout = server[i].fail_timeout;
peer[n].down = server[i].down;
@@ -223,6 +225,7 @@
peer[i].weight = 1;
peer[i].effective_weight = 1;
peer[i].current_weight = 0;
+ peer[i].max_conns = 0;
peer[i].max_fails = 1;
peer[i].fail_timeout = 10;
*peerp = &peer[i];
@@ -257,6 +260,7 @@
rrp->peers = us->peer.data;
rrp->current = NULL;
+ rrp->config = 0;
n = rrp->peers->number;
@@ -337,6 +341,7 @@
peer[0].weight = 1;
peer[0].effective_weight = 1;
peer[0].current_weight = 0;
+ peer[0].max_conns = 0;
peer[0].max_fails = 1;
peer[0].fail_timeout = 10;
peers->peer = peer;
@@ -370,6 +375,7 @@
peer[i].weight = 1;
peer[i].effective_weight = 1;
peer[i].current_weight = 0;
+ peer[i].max_conns = 0;
peer[i].max_fails = 1;
peer[i].fail_timeout = 10;
*peerp = &peer[i];
@@ -379,6 +385,7 @@
rrp->peers = peers;
rrp->current = NULL;
+ rrp->config = 0;
if (rrp->peers->number <= 8 * sizeof(uintptr_t)) {
rrp->tried = &rrp->data;
@@ -432,6 +439,10 @@
goto failed;
}
+ if (peer->max_conns && peer->conns >= peer->max_conns) {
+ goto failed;
+ }
+
rrp->current = peer;
} else {
@@ -485,12 +496,6 @@
ngx_http_upstream_rr_peers_wlock(peers);
}
- /* all peers failed, mark them as live for quick recovery */
-
- for (peer = peers->peer; peer; peer = peer->next) {
- peer->fails = 0;
- }
-
ngx_http_upstream_rr_peers_unlock(peers);
pc->name = peers->name;
@@ -521,7 +526,6 @@
peer;
peer = peer->next, i++)
{
-
n = i / (8 * sizeof(uintptr_t));
m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
@@ -540,6 +544,10 @@
continue;
}
+ if (peer->max_conns && peer->conns >= peer->max_conns) {
+ continue;
+ }
+
peer->current_weight += peer->effective_weight;
total += peer->effective_weight;
@@ -659,7 +667,7 @@
ngx_int_t rc;
ngx_ssl_session_t *ssl_session;
ngx_http_upstream_rr_peer_t *peer;
-#if (NGX_HTTP_UPSTREAM_ZONE)
+#if (NGX_HTTP_UPSTREAM_ZONE || NGX_COMPAT)
int len;
#if OPENSSL_VERSION_NUMBER >= 0x0090707fL
const
@@ -671,7 +679,7 @@
peer = rrp->current;
-#if (NGX_HTTP_UPSTREAM_ZONE)
+#if (NGX_HTTP_UPSTREAM_ZONE || NGX_COMPAT)
peers = rrp->peers;
if (peers->shpool) {
@@ -724,14 +732,14 @@
ngx_ssl_session_t *old_ssl_session, *ssl_session;
ngx_http_upstream_rr_peer_t *peer;
-#if (NGX_HTTP_UPSTREAM_ZONE)
+#if (NGX_HTTP_UPSTREAM_ZONE || NGX_COMPAT)
int len;
u_char *p;
ngx_http_upstream_rr_peers_t *peers;
u_char buf[NGX_SSL_MAX_SESSION_SIZE];
#endif
-#if (NGX_HTTP_UPSTREAM_ZONE)
+#if (NGX_HTTP_UPSTREAM_ZONE || NGX_COMPAT)
peers = rrp->peers;
if (peers->shpool) {