comparison src/core/ngx_resolver.c @ 7051:137c5be7df09

Resolver: factored out setting a timer for resolver timeout. No functional changes.
author Sergey Kandaurov <pluknet@nginx.com>
date Tue, 04 Jul 2017 18:46:30 +0300
parents 80224192163c
children 70e65bf8dfd7
comparison
equal deleted inserted replaced
7050:8c5e3cc21332 7051:137c5be7df09
103 in_addr_t addr); 103 in_addr_t addr);
104 static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp, 104 static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,
105 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); 105 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
106 static ngx_int_t ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name, 106 static ngx_int_t ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name,
107 u_char *buf, u_char *src, u_char *last); 107 u_char *buf, u_char *src, u_char *last);
108 static ngx_int_t ngx_resolver_set_timeout(ngx_resolver_t *r,
109 ngx_resolver_ctx_t *ctx);
108 static void ngx_resolver_timeout_handler(ngx_event_t *ev); 110 static void ngx_resolver_timeout_handler(ngx_event_t *ev);
109 static void ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn); 111 static void ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn);
110 static void *ngx_resolver_alloc(ngx_resolver_t *r, size_t size); 112 static void *ngx_resolver_alloc(ngx_resolver_t *r, size_t size);
111 static void *ngx_resolver_calloc(ngx_resolver_t *r, size_t size); 113 static void *ngx_resolver_calloc(ngx_resolver_t *r, size_t size);
112 static void ngx_resolver_free(ngx_resolver_t *r, void *p); 114 static void ngx_resolver_free(ngx_resolver_t *r, void *p);
726 728
727 return NGX_OK; 729 return NGX_OK;
728 } 730 }
729 731
730 if (rn->waiting) { 732 if (rn->waiting) {
731 733 if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
732 if (ctx->event == NULL && ctx->timeout) { 734 return NGX_ERROR;
733 ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
734 if (ctx->event == NULL) {
735 return NGX_ERROR;
736 }
737
738 ctx->event->handler = ngx_resolver_timeout_handler;
739 ctx->event->data = ctx;
740 ctx->event->log = r->log;
741 ctx->ident = -1;
742
743 ngx_add_timer(ctx->event, ctx->timeout);
744 } 735 }
745 736
746 last->next = rn->waiting; 737 last->next = rn->waiting;
747 rn->waiting = ctx; 738 rn->waiting = ctx;
748 ctx->state = NGX_AGAIN; 739 ctx->state = NGX_AGAIN;
862 853
863 if (ngx_resolver_send_query(r, rn) != NGX_OK) { 854 if (ngx_resolver_send_query(r, rn) != NGX_OK) {
864 goto failed; 855 goto failed;
865 } 856 }
866 857
867 if (ctx->event == NULL && ctx->timeout) { 858 if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
868 ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t)); 859 goto failed;
869 if (ctx->event == NULL) {
870 goto failed;
871 }
872
873 ctx->event->handler = ngx_resolver_timeout_handler;
874 ctx->event->data = ctx;
875 ctx->event->log = r->log;
876 ctx->ident = -1;
877
878 ngx_add_timer(ctx->event, ctx->timeout);
879 } 860 }
880 861
881 if (ngx_resolver_resend_empty(r)) { 862 if (ngx_resolver_resend_empty(r)) {
882 ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000)); 863 ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000));
883 } 864 }
1005 986
1006 return NGX_OK; 987 return NGX_OK;
1007 } 988 }
1008 989
1009 if (rn->waiting) { 990 if (rn->waiting) {
1010 991 if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
1011 if (ctx->event == NULL && ctx->timeout) { 992 return NGX_ERROR;
1012 ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
1013 if (ctx->event == NULL) {
1014 return NGX_ERROR;
1015 }
1016
1017 ctx->event->handler = ngx_resolver_timeout_handler;
1018 ctx->event->data = ctx;
1019 ctx->event->log = r->log;
1020 ctx->ident = -1;
1021
1022 ngx_add_timer(ctx->event, ctx->timeout);
1023 } 993 }
1024 994
1025 ctx->next = rn->waiting; 995 ctx->next = rn->waiting;
1026 rn->waiting = ctx; 996 rn->waiting = ctx;
1027 ctx->state = NGX_AGAIN; 997 ctx->state = NGX_AGAIN;
1087 1057
1088 if (ngx_resolver_send_query(r, rn) != NGX_OK) { 1058 if (ngx_resolver_send_query(r, rn) != NGX_OK) {
1089 goto failed; 1059 goto failed;
1090 } 1060 }
1091 1061
1092 if (ctx->event == NULL && ctx->timeout) { 1062 if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
1093 ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t)); 1063 goto failed;
1094 if (ctx->event == NULL) {
1095 goto failed;
1096 }
1097
1098 ctx->event->handler = ngx_resolver_timeout_handler;
1099 ctx->event->data = ctx;
1100 ctx->event->log = r->log;
1101 ctx->ident = -1;
1102
1103 ngx_add_timer(ctx->event, ctx->timeout);
1104 } 1064 }
1105 1065
1106 if (ngx_resolver_resend_empty(r)) { 1066 if (ngx_resolver_resend_empty(r)) {
1107 ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000)); 1067 ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000));
1108 } 1068 }
4031 } 3991 }
4032 } 3992 }
4033 } 3993 }
4034 3994
4035 3995
3996 static ngx_int_t
3997 ngx_resolver_set_timeout(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
3998 {
3999 if (ctx->event || ctx->timeout == 0) {
4000 return NGX_OK;
4001 }
4002
4003 ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
4004 if (ctx->event == NULL) {
4005 return NGX_ERROR;
4006 }
4007
4008 ctx->event->handler = ngx_resolver_timeout_handler;
4009 ctx->event->data = ctx;
4010 ctx->event->log = r->log;
4011 ctx->ident = -1;
4012
4013 ngx_add_timer(ctx->event, ctx->timeout);
4014
4015 return NGX_OK;
4016 }
4017
4018
4036 static void 4019 static void
4037 ngx_resolver_timeout_handler(ngx_event_t *ev) 4020 ngx_resolver_timeout_handler(ngx_event_t *ev)
4038 { 4021 {
4039 ngx_resolver_ctx_t *ctx; 4022 ngx_resolver_ctx_t *ctx;
4040 4023