comparison src/core/ngx_resolver.c @ 6196:c3ec43580a48

Resolver: canceled resend timer on empty resend queues. This is specifically useful on graceful shutdown.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 17 Jun 2015 17:57:34 +0300
parents adba26ff70b5
children 81d44cd4044e
comparison
equal deleted inserted replaced
6195:e69d5e9be292 6196:c3ec43580a48
69 static ngx_int_t ngx_resolver_create_addr_query(ngx_resolver_node_t *rn, 69 static ngx_int_t ngx_resolver_create_addr_query(ngx_resolver_node_t *rn,
70 ngx_resolver_ctx_t *ctx); 70 ngx_resolver_ctx_t *ctx);
71 static void ngx_resolver_resend_handler(ngx_event_t *ev); 71 static void ngx_resolver_resend_handler(ngx_event_t *ev);
72 static time_t ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree, 72 static time_t ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree,
73 ngx_queue_t *queue); 73 ngx_queue_t *queue);
74 static ngx_uint_t ngx_resolver_resend_empty(ngx_resolver_t *r);
74 static void ngx_resolver_read_response(ngx_event_t *rev); 75 static void ngx_resolver_read_response(ngx_event_t *rev);
75 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, 76 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf,
76 size_t n); 77 size_t n);
77 static void ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n, 78 static void ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n,
78 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype, 79 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype,
461 } 462 }
462 463
463 ngx_resolver_free_locked(r, ctx); 464 ngx_resolver_free_locked(r, ctx);
464 465
465 /* unlock alloc mutex */ 466 /* unlock alloc mutex */
467
468 if (r->event->timer_set && ngx_resolver_resend_empty(r)) {
469 ngx_del_timer(r->event);
470 }
466 } 471 }
467 472
468 473
469 static ngx_int_t 474 static ngx_int_t
470 ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx) 475 ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
1014 } 1019 }
1015 1020
1016 ngx_resolver_free_locked(r, ctx); 1021 ngx_resolver_free_locked(r, ctx);
1017 1022
1018 /* unlock alloc mutex */ 1023 /* unlock alloc mutex */
1024
1025 if (r->event->timer_set && ngx_resolver_resend_empty(r)) {
1026 ngx_del_timer(r->event);
1027 }
1019 } 1028 }
1020 1029
1021 1030
1022 static void 1031 static void
1023 ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue) 1032 ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue)
1220 1229
1221 ngx_rbtree_delete(tree, &rn->node); 1230 ngx_rbtree_delete(tree, &rn->node);
1222 1231
1223 ngx_resolver_free_node(r, rn); 1232 ngx_resolver_free_node(r, rn);
1224 } 1233 }
1234 }
1235
1236
1237 static ngx_uint_t
1238 ngx_resolver_resend_empty(ngx_resolver_t *r)
1239 {
1240 return ngx_queue_empty(&r->name_resend_queue)
1241 #if (NGX_HAVE_INET6)
1242 && ngx_queue_empty(&r->addr6_resend_queue)
1243 #endif
1244 && ngx_queue_empty(&r->addr_resend_queue);
1225 } 1245 }
1226 1246
1227 1247
1228 static void 1248 static void
1229 ngx_resolver_read_response(ngx_event_t *rev) 1249 ngx_resolver_read_response(ngx_event_t *rev)