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.
This commit is contained in:
Valentin Bartenev 2013-03-15 19:49:54 +00:00
parent 3f70ddcfc6
commit 23e692b58d

View File

@ -355,6 +355,7 @@ ngx_http_init_connection(ngx_connection_t *c)
} }
ngx_add_timer(rev, c->listening->post_accept_timeout); ngx_add_timer(rev, c->listening->post_accept_timeout);
ngx_reusable_connection(c, 1);
if (ngx_handle_read_event(rev, 0) != NGX_OK) { if (ngx_handle_read_event(rev, 0) != NGX_OK) {
ngx_http_close_connection(c); ngx_http_close_connection(c);
@ -383,6 +384,11 @@ ngx_http_wait_request_handler(ngx_event_t *rev)
return; return;
} }
if (c->close) {
ngx_http_close_connection(c);
return;
}
hc = c->data; hc = c->data;
cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module); 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) { if (!rev->timer_set) {
ngx_add_timer(rev, c->listening->post_accept_timeout); ngx_add_timer(rev, c->listening->post_accept_timeout);
ngx_reusable_connection(c, 1);
} }
if (ngx_handle_read_event(rev, 0) != NGX_OK) { 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"; c->log->action = "reading client request line";
ngx_reusable_connection(c, 0);
c->data = ngx_http_create_request(c); c->data = ngx_http_create_request(c);
if (c->data == NULL) { if (c->data == NULL) {
ngx_http_close_connection(c); ngx_http_close_connection(c);
@ -611,6 +620,11 @@ ngx_http_ssl_handshake(ngx_event_t *rev)
return; return;
} }
if (c->close) {
ngx_http_close_connection(c);
return;
}
n = recv(c->fd, (char *) buf, 1, MSG_PEEK); n = recv(c->fd, (char *) buf, 1, MSG_PEEK);
err = ngx_socket_errno; err = ngx_socket_errno;
@ -631,6 +645,7 @@ ngx_http_ssl_handshake(ngx_event_t *rev)
if (!rev->timer_set) { if (!rev->timer_set) {
ngx_add_timer(rev, c->listening->post_accept_timeout); ngx_add_timer(rev, c->listening->post_accept_timeout);
ngx_reusable_connection(c, 1);
} }
if (ngx_handle_read_event(rev, 0) != NGX_OK) { 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_add_timer(rev, c->listening->post_accept_timeout);
} }
ngx_reusable_connection(c, 0);
c->ssl->handler = ngx_http_ssl_handshake_handler; c->ssl->handler = ngx_http_ssl_handshake_handler;
return; return;
} }
@ -714,6 +731,8 @@ ngx_http_ssl_handshake_handler(ngx_connection_t *c)
c->read->handler = ngx_http_wait_request_handler; c->read->handler = ngx_http_wait_request_handler;
/* STUB: epoll edge */ c->write->handler = ngx_http_empty_handler; /* STUB: epoll edge */ c->write->handler = ngx_http_empty_handler;
ngx_reusable_connection(c, 1);
ngx_http_wait_request_handler(c->read); ngx_http_wait_request_handler(c->read);
return; return;