comparison src/http/ngx_http_upstream.c @ 5295:a489c31c9783

Upstream: ngx_http_upstream_finalize_request(NGX_ERROR) on errors. Previously, ngx_http_upstream_finalize_request(0) was used in most cases after errors. While with current code there is no difference, use of NGX_ERROR allows to pass a bit more information into ngx_http_upstream_finalize_request().
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 25 Jul 2013 14:56:13 +0400
parents d44c3b36c53f
children 1ccdda1f37f3
comparison
equal deleted inserted replaced
5294:d44c3b36c53f 5295:a489c31c9783
2142 ngx_http_upstream_process_non_buffered_downstream; 2142 ngx_http_upstream_process_non_buffered_downstream;
2143 2143
2144 r->limit_rate = 0; 2144 r->limit_rate = 0;
2145 2145
2146 if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) { 2146 if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {
2147 ngx_http_upstream_finalize_request(r, u, 0); 2147 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2148 return; 2148 return;
2149 } 2149 }
2150 2150
2151 if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) { 2151 if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {
2152 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay"); 2152 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");
2156 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, 2156 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
2157 (const void *) &tcp_nodelay, sizeof(int)) == -1) 2157 (const void *) &tcp_nodelay, sizeof(int)) == -1)
2158 { 2158 {
2159 ngx_connection_error(c, ngx_socket_errno, 2159 ngx_connection_error(c, ngx_socket_errno,
2160 "setsockopt(TCP_NODELAY) failed"); 2160 "setsockopt(TCP_NODELAY) failed");
2161 ngx_http_upstream_finalize_request(r, u, 0); 2161 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2162 return; 2162 return;
2163 } 2163 }
2164 2164
2165 c->tcp_nodelay = NGX_TCP_NODELAY_SET; 2165 c->tcp_nodelay = NGX_TCP_NODELAY_SET;
2166 } 2166 }
2171 u->buffer.last = u->buffer.pos; 2171 u->buffer.last = u->buffer.pos;
2172 2172
2173 u->state->response_length += n; 2173 u->state->response_length += n;
2174 2174
2175 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { 2175 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
2176 ngx_http_upstream_finalize_request(r, u, 0); 2176 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2177 return; 2177 return;
2178 } 2178 }
2179 2179
2180 ngx_http_upstream_process_non_buffered_downstream(r); 2180 ngx_http_upstream_process_non_buffered_downstream(r);
2181 2181
2182 } else { 2182 } else {
2183 u->buffer.pos = u->buffer.start; 2183 u->buffer.pos = u->buffer.start;
2184 u->buffer.last = u->buffer.start; 2184 u->buffer.last = u->buffer.start;
2185 2185
2186 if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) { 2186 if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {
2187 ngx_http_upstream_finalize_request(r, u, 0); 2187 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2188 return; 2188 return;
2189 } 2189 }
2190 2190
2191 if (u->peer.connection->read->ready || u->length == 0) { 2191 if (u->peer.connection->read->ready || u->length == 0) {
2192 ngx_http_upstream_process_non_buffered_upstream(r, u); 2192 ngx_http_upstream_process_non_buffered_upstream(r, u);
2206 } 2206 }
2207 2207
2208 switch (ngx_http_test_predicates(r, u->conf->no_cache)) { 2208 switch (ngx_http_test_predicates(r, u->conf->no_cache)) {
2209 2209
2210 case NGX_ERROR: 2210 case NGX_ERROR:
2211 ngx_http_upstream_finalize_request(r, u, 0); 2211 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2212 return; 2212 return;
2213 2213
2214 case NGX_DECLINED: 2214 case NGX_DECLINED:
2215 u->cacheable = 0; 2215 u->cacheable = 0;
2216 break; 2216 break;
2222 r->cache->min_uses = u->conf->cache_min_uses; 2222 r->cache->min_uses = u->conf->cache_min_uses;
2223 r->cache->body_start = u->conf->buffer_size; 2223 r->cache->body_start = u->conf->buffer_size;
2224 r->cache->file_cache = u->conf->cache->data; 2224 r->cache->file_cache = u->conf->cache->data;
2225 2225
2226 if (ngx_http_file_cache_create(r) != NGX_OK) { 2226 if (ngx_http_file_cache_create(r) != NGX_OK) {
2227 ngx_http_upstream_finalize_request(r, u, 0); 2227 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2228 return; 2228 return;
2229 } 2229 }
2230 } 2230 }
2231 2231
2232 break; 2232 break;
2283 2283
2284 p->cacheable = u->cacheable || u->store; 2284 p->cacheable = u->cacheable || u->store;
2285 2285
2286 p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)); 2286 p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));
2287 if (p->temp_file == NULL) { 2287 if (p->temp_file == NULL) {
2288 ngx_http_upstream_finalize_request(r, u, 0); 2288 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2289 return; 2289 return;
2290 } 2290 }
2291 2291
2292 p->temp_file->file.fd = NGX_INVALID_FILE; 2292 p->temp_file->file.fd = NGX_INVALID_FILE;
2293 p->temp_file->file.log = c->log; 2293 p->temp_file->file.log = c->log;
2306 p->max_temp_file_size = u->conf->max_temp_file_size; 2306 p->max_temp_file_size = u->conf->max_temp_file_size;
2307 p->temp_file_write_size = u->conf->temp_file_write_size; 2307 p->temp_file_write_size = u->conf->temp_file_write_size;
2308 2308
2309 p->preread_bufs = ngx_alloc_chain_link(r->pool); 2309 p->preread_bufs = ngx_alloc_chain_link(r->pool);
2310 if (p->preread_bufs == NULL) { 2310 if (p->preread_bufs == NULL) {
2311 ngx_http_upstream_finalize_request(r, u, 0); 2311 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2312 return; 2312 return;
2313 } 2313 }
2314 2314
2315 p->preread_bufs->buf = &u->buffer; 2315 p->preread_bufs->buf = &u->buffer;
2316 p->preread_bufs->next = NULL; 2316 p->preread_bufs->next = NULL;
2320 2320
2321 if (u->cacheable) { 2321 if (u->cacheable) {
2322 2322
2323 p->buf_to_file = ngx_calloc_buf(r->pool); 2323 p->buf_to_file = ngx_calloc_buf(r->pool);
2324 if (p->buf_to_file == NULL) { 2324 if (p->buf_to_file == NULL) {
2325 ngx_http_upstream_finalize_request(r, u, 0); 2325 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2326 return; 2326 return;
2327 } 2327 }
2328 2328
2329 p->buf_to_file->start = u->buffer.start; 2329 p->buf_to_file->start = u->buffer.start;
2330 p->buf_to_file->pos = u->buffer.start; 2330 p->buf_to_file->pos = u->buffer.start;
2368 p->length = -1; 2368 p->length = -1;
2369 2369
2370 if (u->input_filter_init 2370 if (u->input_filter_init
2371 && u->input_filter_init(p->input_ctx) != NGX_OK) 2371 && u->input_filter_init(p->input_ctx) != NGX_OK)
2372 { 2372 {
2373 ngx_http_upstream_finalize_request(r, u, 0); 2373 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2374 return; 2374 return;
2375 } 2375 }
2376 2376
2377 u->read_event_handler = ngx_http_upstream_process_upstream; 2377 u->read_event_handler = ngx_http_upstream_process_upstream;
2378 r->write_event_handler = ngx_http_upstream_process_downstream; 2378 r->write_event_handler = ngx_http_upstream_process_downstream;
2410 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, 2410 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
2411 (const void *) &tcp_nodelay, sizeof(int)) == -1) 2411 (const void *) &tcp_nodelay, sizeof(int)) == -1)
2412 { 2412 {
2413 ngx_connection_error(c, ngx_socket_errno, 2413 ngx_connection_error(c, ngx_socket_errno,
2414 "setsockopt(TCP_NODELAY) failed"); 2414 "setsockopt(TCP_NODELAY) failed");
2415 ngx_http_upstream_finalize_request(r, u, 0); 2415 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2416 return; 2416 return;
2417 } 2417 }
2418 2418
2419 c->tcp_nodelay = NGX_TCP_NODELAY_SET; 2419 c->tcp_nodelay = NGX_TCP_NODELAY_SET;
2420 } 2420 }
2426 if (setsockopt(u->peer.connection->fd, IPPROTO_TCP, TCP_NODELAY, 2426 if (setsockopt(u->peer.connection->fd, IPPROTO_TCP, TCP_NODELAY,
2427 (const void *) &tcp_nodelay, sizeof(int)) == -1) 2427 (const void *) &tcp_nodelay, sizeof(int)) == -1)
2428 { 2428 {
2429 ngx_connection_error(u->peer.connection, ngx_socket_errno, 2429 ngx_connection_error(u->peer.connection, ngx_socket_errno,
2430 "setsockopt(TCP_NODELAY) failed"); 2430 "setsockopt(TCP_NODELAY) failed");
2431 ngx_http_upstream_finalize_request(r, u, 0); 2431 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2432 return; 2432 return;
2433 } 2433 }
2434 2434
2435 u->peer.connection->tcp_nodelay = NGX_TCP_NODELAY_SET; 2435 u->peer.connection->tcp_nodelay = NGX_TCP_NODELAY_SET;
2436 } 2436 }
2437 } 2437 }
2438 2438
2439 if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) { 2439 if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {
2440 ngx_http_upstream_finalize_request(r, u, 0); 2440 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2441 return; 2441 return;
2442 } 2442 }
2443 2443
2444 if (u->peer.connection->read->ready 2444 if (u->peer.connection->read->ready
2445 || u->buffer.pos != u->buffer.last) 2445 || u->buffer.pos != u->buffer.last)
2535 } 2535 }
2536 2536
2537 if (b->start == NULL) { 2537 if (b->start == NULL) {
2538 b->start = ngx_palloc(r->pool, u->conf->buffer_size); 2538 b->start = ngx_palloc(r->pool, u->conf->buffer_size);
2539 if (b->start == NULL) { 2539 if (b->start == NULL) {
2540 ngx_http_upstream_finalize_request(r, u, 0); 2540 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2541 return; 2541 return;
2542 } 2542 }
2543 2543
2544 b->pos = b->start; 2544 b->pos = b->start;
2545 b->last = b->start; 2545 b->last = b->start;
2558 if (size && dst->write->ready) { 2558 if (size && dst->write->ready) {
2559 2559
2560 n = dst->send(dst, b->pos, size); 2560 n = dst->send(dst, b->pos, size);
2561 2561
2562 if (n == NGX_ERROR) { 2562 if (n == NGX_ERROR) {
2563 ngx_http_upstream_finalize_request(r, u, 0); 2563 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2564 return; 2564 return;
2565 } 2565 }
2566 2566
2567 if (n > 0) { 2567 if (n > 0) {
2568 b->pos += n; 2568 b->pos += n;
2613 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); 2613 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
2614 2614
2615 if (ngx_handle_write_event(upstream->write, u->conf->send_lowat) 2615 if (ngx_handle_write_event(upstream->write, u->conf->send_lowat)
2616 != NGX_OK) 2616 != NGX_OK)
2617 { 2617 {
2618 ngx_http_upstream_finalize_request(r, u, 0); 2618 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2619 return; 2619 return;
2620 } 2620 }
2621 2621
2622 if (upstream->write->active && !upstream->write->ready) { 2622 if (upstream->write->active && !upstream->write->ready) {
2623 ngx_add_timer(upstream->write, u->conf->send_timeout); 2623 ngx_add_timer(upstream->write, u->conf->send_timeout);
2625 } else if (upstream->write->timer_set) { 2625 } else if (upstream->write->timer_set) {
2626 ngx_del_timer(upstream->write); 2626 ngx_del_timer(upstream->write);
2627 } 2627 }
2628 2628
2629 if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) { 2629 if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) {
2630 ngx_http_upstream_finalize_request(r, u, 0); 2630 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2631 return; 2631 return;
2632 } 2632 }
2633 2633
2634 if (upstream->read->active && !upstream->read->ready) { 2634 if (upstream->read->active && !upstream->read->ready) {
2635 ngx_add_timer(upstream->read, u->conf->read_timeout); 2635 ngx_add_timer(upstream->read, u->conf->read_timeout);
2639 } 2639 }
2640 2640
2641 if (ngx_handle_write_event(downstream->write, clcf->send_lowat) 2641 if (ngx_handle_write_event(downstream->write, clcf->send_lowat)
2642 != NGX_OK) 2642 != NGX_OK)
2643 { 2643 {
2644 ngx_http_upstream_finalize_request(r, u, 0); 2644 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2645 return; 2645 return;
2646 } 2646 }
2647 2647
2648 if (ngx_handle_read_event(downstream->read, 0) != NGX_OK) { 2648 if (ngx_handle_read_event(downstream->read, 0) != NGX_OK) {
2649 ngx_http_upstream_finalize_request(r, u, 0); 2649 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2650 return; 2650 return;
2651 } 2651 }
2652 2652
2653 if (downstream->write->active && !downstream->write->ready) { 2653 if (downstream->write->active && !downstream->write->ready) {
2654 ngx_add_timer(downstream->write, clcf->send_timeout); 2654 ngx_add_timer(downstream->write, clcf->send_timeout);
2735 2735
2736 if (u->out_bufs || u->busy_bufs) { 2736 if (u->out_bufs || u->busy_bufs) {
2737 rc = ngx_http_output_filter(r, u->out_bufs); 2737 rc = ngx_http_output_filter(r, u->out_bufs);
2738 2738
2739 if (rc == NGX_ERROR) { 2739 if (rc == NGX_ERROR) {
2740 ngx_http_upstream_finalize_request(r, u, 0); 2740 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2741 return; 2741 return;
2742 } 2742 }
2743 2743
2744 ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs, 2744 ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs,
2745 &u->out_bufs, u->output.tag); 2745 &u->out_bufs, u->output.tag);
2772 2772
2773 if (n > 0) { 2773 if (n > 0) {
2774 u->state->response_length += n; 2774 u->state->response_length += n;
2775 2775
2776 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { 2776 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
2777 ngx_http_upstream_finalize_request(r, u, 0); 2777 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2778 return; 2778 return;
2779 } 2779 }
2780 } 2780 }
2781 2781
2782 do_write = 1; 2782 do_write = 1;
2791 2791
2792 if (downstream->data == r) { 2792 if (downstream->data == r) {
2793 if (ngx_handle_write_event(downstream->write, clcf->send_lowat) 2793 if (ngx_handle_write_event(downstream->write, clcf->send_lowat)
2794 != NGX_OK) 2794 != NGX_OK)
2795 { 2795 {
2796 ngx_http_upstream_finalize_request(r, u, 0); 2796 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2797 return; 2797 return;
2798 } 2798 }
2799 } 2799 }
2800 2800
2801 if (downstream->write->active && !downstream->write->ready) { 2801 if (downstream->write->active && !downstream->write->ready) {
2804 } else if (downstream->write->timer_set) { 2804 } else if (downstream->write->timer_set) {
2805 ngx_del_timer(downstream->write); 2805 ngx_del_timer(downstream->write);
2806 } 2806 }
2807 2807
2808 if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) { 2808 if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) {
2809 ngx_http_upstream_finalize_request(r, u, 0); 2809 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2810 return; 2810 return;
2811 } 2811 }
2812 2812
2813 if (upstream->read->active && !upstream->read->ready) { 2813 if (upstream->read->active && !upstream->read->ready) {
2814 ngx_add_timer(upstream->read, u->conf->read_timeout); 2814 ngx_add_timer(upstream->read, u->conf->read_timeout);
2895 2895
2896 if (!wev->ready) { 2896 if (!wev->ready) {
2897 ngx_add_timer(wev, p->send_timeout); 2897 ngx_add_timer(wev, p->send_timeout);
2898 2898
2899 if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) { 2899 if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {
2900 ngx_http_upstream_finalize_request(r, u, 0); 2900 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2901 } 2901 }
2902 2902
2903 return; 2903 return;
2904 } 2904 }
2905 2905
2920 2920
2921 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, 2921 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
2922 "http downstream delayed"); 2922 "http downstream delayed");
2923 2923
2924 if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) { 2924 if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {
2925 ngx_http_upstream_finalize_request(r, u, 0); 2925 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
2926 } 2926 }
2927 2927
2928 return; 2928 return;
2929 } 2929 }
2930 2930