diff src/http/ngx_http_request.c @ 5114:a46c1cfe7263

Allow to reuse connections that wait their first request. This should improve behavior under deficiency of connections. Since SSL handshake usually takes significant amount of time, we exclude connections from reusable queue during this period to avoid premature flush of them.
author Valentin Bartenev <vbart@nginx.com>
date Fri, 15 Mar 2013 19:49:54 +0000
parents 44bd04fbbb4f
children f10108c92fef
line wrap: on
line diff
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -355,6 +355,7 @@ ngx_http_init_connection(ngx_connection_
     }
 
     ngx_add_timer(rev, c->listening->post_accept_timeout);
+    ngx_reusable_connection(c, 1);
 
     if (ngx_handle_read_event(rev, 0) != NGX_OK) {
         ngx_http_close_connection(c);
@@ -383,6 +384,11 @@ ngx_http_wait_request_handler(ngx_event_
         return;
     }
 
+    if (c->close) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
     hc = c->data;
     cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module);
 
@@ -432,6 +438,7 @@ ngx_http_wait_request_handler(ngx_event_
 
         if (!rev->timer_set) {
             ngx_add_timer(rev, c->listening->post_accept_timeout);
+            ngx_reusable_connection(c, 1);
         }
 
         if (ngx_handle_read_event(rev, 0) != NGX_OK) {
@@ -466,6 +473,8 @@ ngx_http_wait_request_handler(ngx_event_
 
     c->log->action = "reading client request line";
 
+    ngx_reusable_connection(c, 0);
+
     c->data = ngx_http_create_request(c);
     if (c->data == NULL) {
         ngx_http_close_connection(c);
@@ -611,6 +620,11 @@ ngx_http_ssl_handshake(ngx_event_t *rev)
         return;
     }
 
+    if (c->close) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
     n = recv(c->fd, (char *) buf, 1, MSG_PEEK);
 
     err = ngx_socket_errno;
@@ -631,6 +645,7 @@ ngx_http_ssl_handshake(ngx_event_t *rev)
 
             if (!rev->timer_set) {
                 ngx_add_timer(rev, c->listening->post_accept_timeout);
+                ngx_reusable_connection(c, 1);
             }
 
             if (ngx_handle_read_event(rev, 0) != NGX_OK) {
@@ -670,6 +685,8 @@ ngx_http_ssl_handshake(ngx_event_t *rev)
                     ngx_add_timer(rev, c->listening->post_accept_timeout);
                 }
 
+                ngx_reusable_connection(c, 0);
+
                 c->ssl->handler = ngx_http_ssl_handshake_handler;
                 return;
             }
@@ -714,6 +731,8 @@ ngx_http_ssl_handshake_handler(ngx_conne
         c->read->handler = ngx_http_wait_request_handler;
         /* STUB: epoll edge */ c->write->handler = ngx_http_empty_handler;
 
+        ngx_reusable_connection(c, 1);
+
         ngx_http_wait_request_handler(c->read);
 
         return;