Mercurial > hg > nginx
comparison src/http/ngx_http_upstream.c @ 3169:b1013d768911
fix request counter in resolver handling, the bug was introduced in r3050
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 28 Sep 2009 12:31:47 +0000 |
parents | d430c6ab1c99 |
children | b495a56f1f24 |
comparison
equal
deleted
inserted
replaced
3168:83c940b0d18a | 3169:b1013d768911 |
---|---|
530 if (u->resolved->sockaddr) { | 530 if (u->resolved->sockaddr) { |
531 | 531 |
532 if (ngx_http_upstream_create_round_robin_peer(r, u->resolved) | 532 if (ngx_http_upstream_create_round_robin_peer(r, u->resolved) |
533 != NGX_OK) | 533 != NGX_OK) |
534 { | 534 { |
535 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 535 ngx_http_upstream_finalize_request(r, u, |
536 NGX_HTTP_INTERNAL_SERVER_ERROR); | |
536 return; | 537 return; |
537 } | 538 } |
538 | 539 |
539 ngx_http_upstream_connect(r, u); | 540 ngx_http_upstream_connect(r, u); |
540 | 541 |
562 | 563 |
563 temp.name = *host; | 564 temp.name = *host; |
564 | 565 |
565 ctx = ngx_resolve_start(clcf->resolver, &temp); | 566 ctx = ngx_resolve_start(clcf->resolver, &temp); |
566 if (ctx == NULL) { | 567 if (ctx == NULL) { |
567 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 568 ngx_http_upstream_finalize_request(r, u, |
569 NGX_HTTP_INTERNAL_SERVER_ERROR); | |
568 return; | 570 return; |
569 } | 571 } |
570 | 572 |
571 if (ctx == NGX_NO_RESOLVER) { | 573 if (ctx == NGX_NO_RESOLVER) { |
572 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | 574 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
573 "no resolver defined to resolve %V", host); | 575 "no resolver defined to resolve %V", host); |
574 | 576 |
575 ngx_http_finalize_request(r, NGX_HTTP_BAD_GATEWAY); | 577 ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); |
576 return; | 578 return; |
577 } | 579 } |
578 | 580 |
579 ctx->name = *host; | 581 ctx->name = *host; |
580 ctx->type = NGX_RESOLVE_A; | 582 ctx->type = NGX_RESOLVE_A; |
584 | 586 |
585 u->resolved->ctx = ctx; | 587 u->resolved->ctx = ctx; |
586 | 588 |
587 if (ngx_resolve_name(ctx) != NGX_OK) { | 589 if (ngx_resolve_name(ctx) != NGX_OK) { |
588 u->resolved->ctx = NULL; | 590 u->resolved->ctx = NULL; |
589 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 591 ngx_http_upstream_finalize_request(r, u, |
592 NGX_HTTP_INTERNAL_SERVER_ERROR); | |
590 return; | 593 return; |
591 } | 594 } |
592 | 595 |
593 return; | 596 return; |
594 } | 597 } |
595 | 598 |
596 found: | 599 found: |
597 | 600 |
598 if (uscf->peer.init(r, uscf) != NGX_OK) { | 601 if (uscf->peer.init(r, uscf) != NGX_OK) { |
599 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 602 ngx_http_upstream_finalize_request(r, u, |
603 NGX_HTTP_INTERNAL_SERVER_ERROR); | |
600 return; | 604 return; |
601 } | 605 } |
602 | 606 |
603 ngx_http_upstream_connect(r, u); | 607 ngx_http_upstream_connect(r, u); |
604 } | 608 } |
787 | 791 |
788 static void | 792 static void |
789 ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx) | 793 ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx) |
790 { | 794 { |
791 ngx_http_request_t *r; | 795 ngx_http_request_t *r; |
796 ngx_http_upstream_t *u; | |
792 ngx_http_upstream_resolved_t *ur; | 797 ngx_http_upstream_resolved_t *ur; |
793 | 798 |
794 r = ctx->data; | 799 r = ctx->data; |
795 | 800 |
796 r->upstream->resolved->ctx = NULL; | 801 u = r->upstream; |
802 ur = u->resolved; | |
797 | 803 |
798 if (ctx->state) { | 804 if (ctx->state) { |
799 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | 805 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
800 "%V could not be resolved (%i: %s)", | 806 "%V could not be resolved (%i: %s)", |
801 &ctx->name, ctx->state, | 807 &ctx->name, ctx->state, |
802 ngx_resolver_strerror(ctx->state)); | 808 ngx_resolver_strerror(ctx->state)); |
803 | 809 |
804 ngx_resolve_name_done(ctx); | 810 ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); |
805 ngx_http_finalize_request(r, NGX_HTTP_BAD_GATEWAY); | 811 return; |
806 return; | 812 } |
807 } | 813 |
808 | |
809 ur = r->upstream->resolved; | |
810 ur->naddrs = ctx->naddrs; | 814 ur->naddrs = ctx->naddrs; |
811 ur->addrs = ctx->addrs; | 815 ur->addrs = ctx->addrs; |
812 | 816 |
813 #if (NGX_DEBUG) | 817 #if (NGX_DEBUG) |
814 { | 818 { |
825 } | 829 } |
826 } | 830 } |
827 #endif | 831 #endif |
828 | 832 |
829 if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) { | 833 if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) { |
830 ngx_resolve_name_done(ctx); | 834 ngx_http_upstream_finalize_request(r, u, |
831 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 835 NGX_HTTP_INTERNAL_SERVER_ERROR); |
832 return; | 836 return; |
833 } | 837 } |
834 | 838 |
835 ngx_resolve_name_done(ctx); | 839 ngx_resolve_name_done(ctx); |
836 | 840 ur->ctx = NULL; |
837 ngx_http_upstream_connect(r, r->upstream); | 841 |
842 ngx_http_upstream_connect(r, u); | |
838 } | 843 } |
839 | 844 |
840 | 845 |
841 static void | 846 static void |
842 ngx_http_upstream_handler(ngx_event_t *ev) | 847 ngx_http_upstream_handler(ngx_event_t *ev) |
916 if (!u->cacheable) { | 921 if (!u->cacheable) { |
917 ngx_http_upstream_finalize_request(r, u, | 922 ngx_http_upstream_finalize_request(r, u, |
918 NGX_HTTP_CLIENT_CLOSED_REQUEST); | 923 NGX_HTTP_CLIENT_CLOSED_REQUEST); |
919 } | 924 } |
920 | 925 |
921 return; | |
922 } | |
923 | |
924 if (u->peer.connection == NULL) { | |
925 return; | 926 return; |
926 } | 927 } |
927 | 928 |
928 #if (NGX_HAVE_KQUEUE) | 929 #if (NGX_HAVE_KQUEUE) |
929 | 930 |
954 "prematurely connection"); | 955 "prematurely connection"); |
955 | 956 |
956 if (u->peer.connection == NULL) { | 957 if (u->peer.connection == NULL) { |
957 ngx_http_upstream_finalize_request(r, u, | 958 ngx_http_upstream_finalize_request(r, u, |
958 NGX_HTTP_CLIENT_CLOSED_REQUEST); | 959 NGX_HTTP_CLIENT_CLOSED_REQUEST); |
959 return; | |
960 } | 960 } |
961 | 961 |
962 return; | 962 return; |
963 } | 963 } |
964 | 964 |
1017 "client closed prematurely connection"); | 1017 "client closed prematurely connection"); |
1018 | 1018 |
1019 if (u->peer.connection == NULL) { | 1019 if (u->peer.connection == NULL) { |
1020 ngx_http_upstream_finalize_request(r, u, | 1020 ngx_http_upstream_finalize_request(r, u, |
1021 NGX_HTTP_CLIENT_CLOSED_REQUEST); | 1021 NGX_HTTP_CLIENT_CLOSED_REQUEST); |
1022 return; | |
1023 } | 1022 } |
1024 } | 1023 } |
1025 | 1024 |
1026 | 1025 |
1027 static void | 1026 static void |
2835 | 2834 |
2836 u = r->upstream; | 2835 u = r->upstream; |
2837 | 2836 |
2838 if (u->resolved && u->resolved->ctx) { | 2837 if (u->resolved && u->resolved->ctx) { |
2839 ngx_resolve_name_done(u->resolved->ctx); | 2838 ngx_resolve_name_done(u->resolved->ctx); |
2839 u->resolved->ctx = NULL; | |
2840 } | 2840 } |
2841 | 2841 |
2842 ngx_http_upstream_finalize_request(r, u, NGX_DONE); | 2842 ngx_http_upstream_finalize_request(r, u, NGX_DONE); |
2843 } | 2843 } |
2844 | 2844 |
2852 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | 2852 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
2853 "finalize http upstream request: %i", rc); | 2853 "finalize http upstream request: %i", rc); |
2854 | 2854 |
2855 if (u->cleanup) { | 2855 if (u->cleanup) { |
2856 *u->cleanup = NULL; | 2856 *u->cleanup = NULL; |
2857 } | |
2858 | |
2859 if (u->resolved && u->resolved->ctx) { | |
2860 ngx_resolve_name_done(u->resolved->ctx); | |
2861 u->resolved->ctx = NULL; | |
2857 } | 2862 } |
2858 | 2863 |
2859 if (u->state && u->state->response_sec) { | 2864 if (u->state && u->state->response_sec) { |
2860 tp = ngx_timeofday(); | 2865 tp = ngx_timeofday(); |
2861 u->state->response_sec = tp->sec - u->state->response_sec; | 2866 u->state->response_sec = tp->sec - u->state->response_sec; |