Mercurial > hg > nginx
changeset 7766:3e83336cda5b
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.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Thu, 11 Feb 2021 21:52:09 +0300 |
parents | 519b55453c45 |
children | 6d98f29867e8 |
files | src/http/ngx_http_request.c src/http/v2/ngx_http_v2.c |
diffstat | 2 files changed, 8 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/http/ngx_http_request.c Mon Feb 01 16:42:50 2021 +0300 +++ b/src/http/ngx_http_request.c Thu Feb 11 21:52:09 2021 +0300 @@ -3437,6 +3437,9 @@ return; } + c->close = 0; + ngx_reusable_connection(c, 1); + ngx_add_timer(rev, clcf->lingering_timeout); if (rev->ready) { @@ -3461,7 +3464,7 @@ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http lingering close handler"); - if (rev->timedout) { + if (rev->timedout || c->close) { ngx_http_close_request(r, 0); return; }
--- a/src/http/v2/ngx_http_v2.c Mon Feb 01 16:42:50 2021 +0300 +++ b/src/http/v2/ngx_http_v2.c Thu Feb 11 21:52:09 2021 +0300 @@ -767,6 +767,9 @@ return; } + c->close = 0; + ngx_reusable_connection(c, 1); + ngx_add_timer(rev, clcf->lingering_timeout); if (rev->ready) { @@ -791,7 +794,7 @@ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 lingering close handler"); - if (rev->timedout) { + if (rev->timedout || c->close) { ngx_http_close_connection(c); return; }