mirror of
https://github.com/nginx/nginx.git
synced 2024-11-24 04:49:01 +08:00
Reuse of connections in lingering close.
This is particularly important in HTTP/2, where keepalive connections are closed with lingering. Before the patch, reusing a keepalive HTTP/2 connection resulted in the connection waiting for lingering close to remain in the reusable connections queue, preventing ngx_drain_connections() from closing additional connections. The patch fixes it by marking the connection reusable again, and so moving it in the reusable connections queue. Further, it makes actually possible to reuse such connections if needed.
This commit is contained in:
parent
327e21c432
commit
fb2a2152d7
@ -3437,6 +3437,9 @@ ngx_http_set_lingering_close(ngx_connection_t *c)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c->close = 0;
|
||||||
|
ngx_reusable_connection(c, 1);
|
||||||
|
|
||||||
ngx_add_timer(rev, clcf->lingering_timeout);
|
ngx_add_timer(rev, clcf->lingering_timeout);
|
||||||
|
|
||||||
if (rev->ready) {
|
if (rev->ready) {
|
||||||
@ -3461,7 +3464,7 @@ ngx_http_lingering_close_handler(ngx_event_t *rev)
|
|||||||
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
||||||
"http lingering close handler");
|
"http lingering close handler");
|
||||||
|
|
||||||
if (rev->timedout) {
|
if (rev->timedout || c->close) {
|
||||||
ngx_http_close_request(r, 0);
|
ngx_http_close_request(r, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -767,6 +767,9 @@ ngx_http_v2_lingering_close(ngx_connection_t *c)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c->close = 0;
|
||||||
|
ngx_reusable_connection(c, 1);
|
||||||
|
|
||||||
ngx_add_timer(rev, clcf->lingering_timeout);
|
ngx_add_timer(rev, clcf->lingering_timeout);
|
||||||
|
|
||||||
if (rev->ready) {
|
if (rev->ready) {
|
||||||
@ -791,7 +794,7 @@ ngx_http_v2_lingering_close_handler(ngx_event_t *rev)
|
|||||||
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
||||||
"http2 lingering close handler");
|
"http2 lingering close handler");
|
||||||
|
|
||||||
if (rev->timedout) {
|
if (rev->timedout || c->close) {
|
||||||
ngx_http_close_connection(c);
|
ngx_http_close_connection(c);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user