comparison src/core/ngx_resolver.c @ 5812:954867a2f0a6

Resolver: notify all waiting requests on timeout. If a "resolver_timeout" occurs, only the first waiting request was notified. Other requests may hang forever.
author Ruslan Ermilov <ru@nginx.com>
date Tue, 19 Aug 2014 15:43:26 +0400
parents 70a0408cca7b
children 3377f9459e99
comparison
equal deleted inserted replaced
5811:f5b612019042 5812:954867a2f0a6
415 ngx_del_timer(ctx->event); 415 ngx_del_timer(ctx->event);
416 } 416 }
417 417
418 /* lock name mutex */ 418 /* lock name mutex */
419 419
420 if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) { 420 if (ctx->state == NGX_AGAIN) {
421 421
422 hash = ngx_crc32_short(ctx->name.data, ctx->name.len); 422 hash = ngx_crc32_short(ctx->name.data, ctx->name.len);
423 423
424 rn = ngx_resolver_lookup_name(r, &ctx->name, hash); 424 rn = ngx_resolver_lookup_name(r, &ctx->name, hash);
425 425
662 if (ctx->event == NULL) { 662 if (ctx->event == NULL) {
663 goto failed; 663 goto failed;
664 } 664 }
665 665
666 ctx->event->handler = ngx_resolver_timeout_handler; 666 ctx->event->handler = ngx_resolver_timeout_handler;
667 ctx->event->data = ctx; 667 ctx->event->data = rn;
668 ctx->event->log = r->log; 668 ctx->event->log = r->log;
669 ctx->ident = -1; 669 ctx->ident = -1;
670 670
671 ngx_add_timer(ctx->event, ctx->timeout); 671 ngx_add_timer(ctx->event, ctx->timeout);
672 } 672 }
855 if (ctx->event == NULL) { 855 if (ctx->event == NULL) {
856 goto failed; 856 goto failed;
857 } 857 }
858 858
859 ctx->event->handler = ngx_resolver_timeout_handler; 859 ctx->event->handler = ngx_resolver_timeout_handler;
860 ctx->event->data = ctx; 860 ctx->event->data = rn;
861 ctx->event->log = r->log; 861 ctx->event->log = r->log;
862 ctx->ident = -1; 862 ctx->ident = -1;
863 863
864 ngx_add_timer(ctx->event, ctx->timeout); 864 ngx_add_timer(ctx->event, ctx->timeout);
865 865
947 ngx_del_timer(ctx->event); 947 ngx_del_timer(ctx->event);
948 } 948 }
949 949
950 /* lock addr mutex */ 950 /* lock addr mutex */
951 951
952 if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) { 952 if (ctx->state == NGX_AGAIN) {
953 953
954 switch (ctx->addr.sockaddr->sa_family) { 954 switch (ctx->addr.sockaddr->sa_family) {
955 955
956 #if (NGX_HAVE_INET6) 956 #if (NGX_HAVE_INET6)
957 case AF_INET6: 957 case AF_INET6:
2788 2788
2789 2789
2790 static void 2790 static void
2791 ngx_resolver_timeout_handler(ngx_event_t *ev) 2791 ngx_resolver_timeout_handler(ngx_event_t *ev)
2792 { 2792 {
2793 ngx_resolver_ctx_t *ctx; 2793 ngx_resolver_ctx_t *ctx, *next;
2794 2794 ngx_resolver_node_t *rn;
2795 ctx = ev->data; 2795
2796 2796 rn = ev->data;
2797 ctx->state = NGX_RESOLVE_TIMEDOUT; 2797 ctx = rn->waiting;
2798 2798 rn->waiting = NULL;
2799 ctx->handler(ctx); 2799
2800 do {
2801 ctx->state = NGX_RESOLVE_TIMEDOUT;
2802 next = ctx->next;
2803
2804 ctx->handler(ctx);
2805
2806 ctx = next;
2807 } while (ctx);
2800 } 2808 }
2801 2809
2802 2810
2803 static void 2811 static void
2804 ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn) 2812 ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn)