details: http://hg.nginx.org/nginx/rev/2e5c027f2a98 branches: changeset: 6366:2e5c027f2a98 user: Roman Arutyunyan <a...@nginx.com> date: Thu Jan 28 15:28:20 2016 +0300 description: Resolver: per-request DNS server balancer.
Previously, a global server balancer was used to assign the next DNS server to send a query to. That could lead to a non-uniform distribution of servers per request. A request could be assigned to the same dead server several times in a row and wait longer for a valid server or even time out without being processed. Now each query is sent to all servers sequentially in a circle until a response is received or timeout expires. Initial server for each request is still globally balanced. diffstat: src/core/ngx_resolver.c | 20 +++++++++++++++----- src/core/ngx_resolver.h | 2 ++ 2 files changed, 17 insertions(+), 5 deletions(-) diffs (63 lines): diff -r d35b4d590b2d -r 2e5c027f2a98 src/core/ngx_resolver.c --- a/src/core/ngx_resolver.c Thu Jan 28 15:28:20 2016 +0300 +++ b/src/core/ngx_resolver.c Thu Jan 28 15:28:20 2016 +0300 @@ -685,6 +685,11 @@ ngx_resolve_name_locked(ngx_resolver_t * return NGX_OK; } + rn->last_connection = r->last_connection++; + if (r->last_connection == r->connections.nelts) { + r->last_connection = 0; + } + rn->naddrs = (u_short) -1; #if (NGX_HAVE_INET6) rn->naddrs6 = r->ipv6 ? (u_short) -1 : 0; @@ -897,6 +902,11 @@ ngx_resolve_addr(ngx_resolver_ctx_t *ctx goto failed; } + rn->last_connection = r->last_connection++; + if (r->last_connection == r->connections.nelts) { + r->last_connection = 0; + } + rn->naddrs = (u_short) -1; #if (NGX_HAVE_INET6) rn->naddrs6 = (u_short) -1; @@ -1098,11 +1108,7 @@ ngx_resolver_send_query(ngx_resolver_t * ngx_resolver_connection_t *rec; rec = r->connections.elts; - - rec = &rec[r->last_connection++]; - if (r->last_connection == r->connections.nelts) { - r->last_connection = 0; - } + rec = &rec[rn->last_connection]; if (rec->udp == NULL) { @@ -1244,6 +1250,10 @@ ngx_resolver_resend(ngx_resolver_t *r, n if (rn->waiting) { + if (++rn->last_connection == r->connections.nelts) { + rn->last_connection = 0; + } + (void) ngx_resolver_send_query(r, rn); rn->expire = now + r->resend_timeout; diff -r d35b4d590b2d -r 2e5c027f2a98 src/core/ngx_resolver.h --- a/src/core/ngx_resolver.h Thu Jan 28 15:28:20 2016 +0300 +++ b/src/core/ngx_resolver.h Thu Jan 28 15:28:20 2016 +0300 @@ -93,6 +93,8 @@ typedef struct { time_t valid; uint32_t ttl; + ngx_uint_t last_connection; + ngx_resolver_ctx_t *waiting; } ngx_resolver_node_t; _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel