Skip to content

Commit

Permalink
Resolver: fixed handling of partially resolved SRV.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
xeioex committed Dec 16, 2016
1 parent e114960 commit b69a35f
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/core/ngx_resolver.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;
Expand Down

0 comments on commit b69a35f

Please sign in to comment.