aboutsummaryrefslogtreecommitdiff
path: root/src/http/modules/ngx_http_upstream_random_module.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/modules/ngx_http_upstream_random_module.c')
-rw-r--r--src/http/modules/ngx_http_upstream_random_module.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/http/modules/ngx_http_upstream_random_module.c b/src/http/modules/ngx_http_upstream_random_module.c
index 6f169c8f6..74714874b 100644
--- a/src/http/modules/ngx_http_upstream_random_module.c
+++ b/src/http/modules/ngx_http_upstream_random_module.c
@@ -17,6 +17,9 @@ typedef struct {
typedef struct {
ngx_uint_t two;
+#if (NGX_HTTP_UPSTREAM_ZONE)
+ ngx_uint_t config;
+#endif
ngx_http_upstream_random_range_t *ranges;
} ngx_http_upstream_random_srv_conf_t;
@@ -127,6 +130,11 @@ ngx_http_upstream_update_random(ngx_pool_t *pool,
rcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_random_module);
+ if (rcf->ranges) {
+ ngx_free(rcf->ranges);
+ rcf->ranges = NULL;
+ }
+
peers = us->peer.data;
size = peers->number * sizeof(ngx_http_upstream_random_range_t);
@@ -186,11 +194,15 @@ ngx_http_upstream_init_random_peer(ngx_http_request_t *r,
ngx_http_upstream_rr_peers_rlock(rp->rrp.peers);
#if (NGX_HTTP_UPSTREAM_ZONE)
- if (rp->rrp.peers->shpool && rcf->ranges == NULL) {
+ if (rp->rrp.peers->config
+ && (rcf->ranges == NULL || rcf->config != *rp->rrp.peers->config))
+ {
if (ngx_http_upstream_update_random(NULL, us) != NGX_OK) {
ngx_http_upstream_rr_peers_unlock(rp->rrp.peers);
return NGX_ERROR;
}
+
+ rcf->config = *rp->rrp.peers->config;
}
#endif
@@ -220,11 +232,18 @@ ngx_http_upstream_get_random_peer(ngx_peer_connection_t *pc, void *data)
ngx_http_upstream_rr_peers_rlock(peers);
- if (rp->tries > 20 || peers->single) {
+ if (rp->tries > 20 || peers->number < 2) {
ngx_http_upstream_rr_peers_unlock(peers);
return ngx_http_upstream_get_round_robin_peer(pc, rrp);
}
+#if (NGX_HTTP_UPSTREAM_ZONE)
+ if (peers->config && rrp->config != *peers->config) {
+ ngx_http_upstream_rr_peers_unlock(peers);
+ return ngx_http_upstream_get_round_robin_peer(pc, rrp);
+ }
+#endif
+
pc->cached = 0;
pc->connection = NULL;
@@ -274,6 +293,7 @@ ngx_http_upstream_get_random_peer(ngx_peer_connection_t *pc, void *data)
}
rrp->current = peer;
+ ngx_http_upstream_rr_peer_ref(peers, peer);
if (now - peer->checked > peer->fail_timeout) {
peer->checked = now;
@@ -314,10 +334,17 @@ ngx_http_upstream_get_random2_peer(ngx_peer_connection_t *pc, void *data)
ngx_http_upstream_rr_peers_wlock(peers);
- if (rp->tries > 20 || peers->single) {
+ if (rp->tries > 20 || peers->number < 2) {
+ ngx_http_upstream_rr_peers_unlock(peers);
+ return ngx_http_upstream_get_round_robin_peer(pc, rrp);
+ }
+
+#if (NGX_HTTP_UPSTREAM_ZONE)
+ if (peers->config && rrp->config != *peers->config) {
ngx_http_upstream_rr_peers_unlock(peers);
return ngx_http_upstream_get_round_robin_peer(pc, rrp);
}
+#endif
pc->cached = 0;
pc->connection = NULL;
@@ -384,6 +411,7 @@ ngx_http_upstream_get_random2_peer(ngx_peer_connection_t *pc, void *data)
}
rrp->current = peer;
+ ngx_http_upstream_rr_peer_ref(peers, peer);
if (now - peer->checked > peer->fail_timeout) {
peer->checked = now;
@@ -467,6 +495,7 @@ ngx_http_upstream_random(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
uscf->peer.init_upstream = ngx_http_upstream_init_random;
uscf->flags = NGX_HTTP_UPSTREAM_CREATE
+ |NGX_HTTP_UPSTREAM_MODIFY
|NGX_HTTP_UPSTREAM_WEIGHT
|NGX_HTTP_UPSTREAM_MAX_CONNS
|NGX_HTTP_UPSTREAM_MAX_FAILS