diff --git a/src/http/modules/ngx_http_upstream_ip_hash_module.c b/src/http/modules/ngx_http_upstream_ip_hash_module.c index fd9ecbe..d3849b6 100644 --- a/src/http/modules/ngx_http_upstream_ip_hash_module.c +++ b/src/http/modules/ngx_http_upstream_ip_hash_module.c @@ -9,6 +9,10 @@ #include #include +#if (NGX_HTTP_UPSTREAM_CHECK) +#include "ngx_http_upstream_check_module.h" +#endif + typedef struct { /* the round robin data must be first */ @@ -182,6 +186,12 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data) if (!peer->down) { +#if (NGX_HTTP_UPSTREAM_CHECK) + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "get ip_hash peer, check_index: %ui", + peer->check_index); + if (!ngx_http_upstream_check_peer_down(peer->check_index)) { +#endif if (peer->max_fails == 0 || peer->fails < peer->max_fails) { break; } @@ -190,6 +200,9 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data) peer->fails = 0; break; } +#if (NGX_HTTP_UPSTREAM_CHECK) + } +#endif } iphp->rrp.tried[n] |= m; diff --git a/src/http/ngx_http_upstream_round_robin.c b/src/http/ngx_http_upstream_round_robin.c index afc9b2e..1c0344e 100644 --- a/src/http/ngx_http_upstream_round_robin.c +++ b/src/http/ngx_http_upstream_round_robin.c @@ -9,6 +9,9 @@ #include #include +#if (NGX_HTTP_UPSTREAM_CHECK) +#include "ngx_http_upstream_check_module.h" +#endif static ngx_int_t ngx_http_upstream_cmp_servers(const void *one, const void *two); @@ -75,6 +78,17 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf, peers->peer[n].down = server[i].down; peers->peer[n].weight = server[i].down ? 0 : server[i].weight; peers->peer[n].current_weight = peers->peer[n].weight; + +#if (NGX_HTTP_UPSTREAM_CHECK) + if (!server[i].down) { + peers->peer[n].check_index = + ngx_http_upstream_check_add_peer(cf, us, &server[i].addrs[j]); + } + else { + peers->peer[n].check_index = (ngx_uint_t) NGX_ERROR; + } +#endif + n++; } } @@ -128,6 +142,17 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf, backup->peer[n].max_fails = server[i].max_fails; backup->peer[n].fail_timeout = server[i].fail_timeout; backup->peer[n].down = server[i].down; + +#if (NGX_HTTP_UPSTREAM_CHECK) + if (!server[i].down) { + backup->peer[n].check_index = + ngx_http_upstream_check_add_peer(cf, us, &server[i].addrs[j]); + } + else { + backup->peer[n].check_index = (ngx_uint_t) NGX_ERROR; + } +#endif + n++; } } @@ -186,6 +211,9 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf, peers->peer[i].current_weight = 1; peers->peer[i].max_fails = 1; peers->peer[i].fail_timeout = 10; +#if (NGX_HTTP_UPSTREAM_CHECK) + peers->peer[i].check_index = (ngx_uint_t) NGX_ERROR; +#endif } us->peer.data = peers; @@ -302,6 +330,9 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, peers->peer[0].current_weight = 1; peers->peer[0].max_fails = 1; peers->peer[0].fail_timeout = 10; +#if (NGX_HTTP_UPSTREAM_CHECK) + peers->peer[0].check_index = (ngx_uint_t) NGX_ERROR; +#endif } else { @@ -334,6 +365,9 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, peers->peer[i].current_weight = 1; peers->peer[i].max_fails = 1; peers->peer[i].fail_timeout = 10; +#if (NGX_HTTP_UPSTREAM_CHECK) + peers->peer[i].check_index = (ngx_uint_t) NGX_ERROR; +#endif } } @@ -411,7 +445,11 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) if (rrp->peers->single) { peer = &rrp->peers->peer[0]; - +#if (NGX_HTTP_UPSTREAM_CHECK) + if (ngx_http_upstream_check_peer_down(peer->check_index)) { + return NGX_BUSY; + } +#endif } else { /* there are several peers */ @@ -438,6 +476,12 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) if (!peer->down) { +#if (NGX_HTTP_UPSTREAM_CHECK) + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "get rr peer, check_index: %ui", + peer->check_index); + if (!ngx_http_upstream_check_peer_down(peer->check_index)) { +#endif if (peer->max_fails == 0 || peer->fails < peer->max_fails) { @@ -448,6 +492,9 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) peer->fails = 0; break; } +#if (NGX_HTTP_UPSTREAM_CHECK) + } +#endif peer->current_weight = 0; @@ -486,6 +533,12 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) if (!peer->down) { +#if (NGX_HTTP_UPSTREAM_CHECK) + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "get rr peer2, check_index: %ui", + peer->check_index); + if (!ngx_http_upstream_check_peer_down(peer->check_index)) { +#endif if (peer->max_fails == 0 || peer->fails < peer->max_fails) { @@ -496,6 +549,9 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) peer->fails = 0; break; } +#if (NGX_HTTP_UPSTREAM_CHECK) + } +#endif peer->current_weight = 0; diff --git a/src/http/ngx_http_upstream_round_robin.h b/src/http/ngx_http_upstream_round_robin.h index 6d285ab..354cca2 100644 --- a/src/http/ngx_http_upstream_round_robin.h +++ b/src/http/ngx_http_upstream_round_robin.h @@ -28,6 +28,10 @@ typedef struct { ngx_uint_t max_fails; time_t fail_timeout; +#if (NGX_HTTP_UPSTREAM_CHECK) + ngx_uint_t check_index; +#endif + ngx_uint_t down; /* unsigned down:1; */ #if (NGX_HTTP_SSL)