]> git.kaiwu.me - nginx.git/commitdiff
Allow to reuse connections that wait their first request.
authorValentin Bartenev <vbart@nginx.com>
Fri, 15 Mar 2013 19:49:54 +0000 (19:49 +0000)
committerValentin Bartenev <vbart@nginx.com>
Fri, 15 Mar 2013 19:49:54 +0000 (19:49 +0000)
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.

src/http/ngx_http_request.c

index 87df262375ac96b283302cdb646decfd9dd474f0..1cab9ee2bc00aa2d8dfa6be2b5f24dbf24a3cb92 100644 (file)
@@ -355,6 +355,7 @@ ngx_http_init_connection(ngx_connection_t *c)
     }
 
     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_t *rev)
         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_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) {
@@ -466,6 +473,8 @@ ngx_http_wait_request_handler(ngx_event_t *rev)
 
     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_connection_t *c)
         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;