Welcome! Log In Create A New Profile

Advanced

[nginx] Resolver: fixed CNAME processing for several requests.

Maxim Dounin
January 26, 2016 11:36AM
details: http://hg.nginx.org/nginx/rev/978e79b95c9f
branches:
changeset: 6349:978e79b95c9f
user: Ruslan Ermilov <ru@nginx.com>
date: Tue Jan 26 16:46:38 2016 +0300
description:
Resolver: fixed CNAME processing for several requests.

When several requests were waiting for a response, then after getting
a CNAME response only the last request was properly processed, while
others were left waiting.

diffstat:

src/core/ngx_resolver.c | 21 +++++++++++++++------
1 files changed, 15 insertions(+), 6 deletions(-)

diffs (66 lines):

diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -478,7 +478,7 @@ ngx_resolve_name_locked(ngx_resolver_t *
ngx_int_t rc;
ngx_uint_t naddrs;
ngx_addr_t *addrs;
- ngx_resolver_ctx_t *next;
+ ngx_resolver_ctx_t *next, *last;
ngx_resolver_node_t *rn;

ngx_strlow(ctx->name.data, ctx->name.data, ctx->name.len);
@@ -489,6 +489,9 @@ ngx_resolve_name_locked(ngx_resolver_t *

if (rn) {

+ /* ctx can be a list after NGX_RESOLVE_CNAME */
+ for (last = ctx; last->next; last = last->next);
+
if (rn->valid >= ngx_time()) {

ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolve cached");
@@ -516,7 +519,7 @@ ngx_resolve_name_locked(ngx_resolver_t *
}
}

- ctx->next = rn->waiting;
+ last->next = rn->waiting;
rn->waiting = NULL;

/* unlock name mutex */
@@ -562,7 +565,7 @@ ngx_resolve_name_locked(ngx_resolver_t *
return ngx_resolve_name_locked(r, ctx);
}

- ctx->next = rn->waiting;
+ last->next = rn->waiting;
rn->waiting = NULL;

/* unlock name mutex */
@@ -595,7 +598,7 @@ ngx_resolve_name_locked(ngx_resolver_t *
ngx_add_timer(ctx->event, ctx->timeout);
}

- ctx->next = rn->waiting;
+ last->next = rn->waiting;
rn->waiting = ctx;
ctx->state = NGX_AGAIN;

@@ -666,8 +669,14 @@ ngx_resolve_name_locked(ngx_resolver_t *
ngx_resolver_free(r, rn->name);
ngx_resolver_free(r, rn);

- ctx->state = NGX_RESOLVE_NXDOMAIN;
- ctx->handler(ctx);
+ do {
+ ctx->state = NGX_RESOLVE_NXDOMAIN;
+ next = ctx->next;
+
+ ctx->handler(ctx);
+
+ ctx = next;
+ } while (ctx);

return NGX_OK;
}

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Resolver: fixed CNAME processing for several requests.

Maxim Dounin 192 January 26, 2016 11:36AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 186
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready