From b69a35ffb12f60f18a69a007b2db4c57f3e52027 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Fri, 16 Dec 2016 18:21:55 +0300 Subject: [PATCH] Resolver: fixed handling of partially resolved SRV. The resolver handles SRV requests in two stages. In the first stage it gets all SRV RRs, and in the second stage it resolves the names from SRV RRs into addresses. Previously, if a response to an SRV request was cached, the queries to resolve names were not limited by a timeout. If a response to any of these queries was not received, the SRV request could never complete. If a response to an SRV request was not cached, and some of the queries to resolve names timed out, NGX_RESOLVE_TIMEDOUT was returned instead of successfully resolved addresses. To fix both issues, resolving of names is now always limited by a timeout. --- src/core/ngx_resolver.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c index 54e037de004..f179b64aaf0 100644 --- a/src/core/ngx_resolver.c +++ b/src/core/ngx_resolver.c @@ -2955,6 +2955,10 @@ ngx_resolver_resolve_srv_names(ngx_resolver_ctx_t *ctx, ngx_resolver_node_t *rn) ctx->srvs = srvs; ctx->nsrvs = rn->nsrvs; + if (ctx->event && ctx->event->timer_set) { + ngx_del_timer(ctx->event); + } + for (i = 0; i < rn->nsrvs; i++) { srvs[i].name.data = ngx_resolver_alloc(r, rn->u.srvs[i].name.len); if (srvs[i].name.data == NULL) { @@ -2974,7 +2978,7 @@ ngx_resolver_resolve_srv_names(ngx_resolver_ctx_t *ctx, ngx_resolver_node_t *rn) cctx->handler = ngx_resolver_srv_names_handler; cctx->data = ctx; cctx->srvs = &srvs[i]; - cctx->timeout = 0; + cctx->timeout = ctx->timeout; srvs[i].priority = rn->u.srvs[i].priority; srvs[i].weight = rn->u.srvs[i].weight;