]> git.kaiwu.me - nginx.git/commitdiff
Reuse of connections in lingering close.
authorMaxim Dounin <mdounin@mdounin.ru>
Thu, 11 Feb 2021 18:52:09 +0000 (21:52 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Thu, 11 Feb 2021 18:52:09 +0000 (21:52 +0300)
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.

src/http/ngx_http_request.c
src/http/v2/ngx_http_v2.c

index 68d81e9320e544d800848d84815c1828f206c1bd..d129f80796f9bd12fcf18b978fecb190e209fdf1 100644 (file)
@@ -3437,6 +3437,9 @@ ngx_http_set_lingering_close(ngx_connection_t *c)
         return;
     }
 
+    c->close = 0;
+    ngx_reusable_connection(c, 1);
+
     ngx_add_timer(rev, clcf->lingering_timeout);
 
     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,
                    "http lingering close handler");
 
-    if (rev->timedout) {
+    if (rev->timedout || c->close) {
         ngx_http_close_request(r, 0);
         return;
     }
index 7c1ba597f2df370cb60159253c333d5f56a71917..2af3ef7e50d9b47368a88b9e18e7f9c24688d828 100644 (file)
@@ -767,6 +767,9 @@ ngx_http_v2_lingering_close(ngx_connection_t *c)
         return;
     }
 
+    c->close = 0;
+    ngx_reusable_connection(c, 1);
+
     ngx_add_timer(rev, clcf->lingering_timeout);
 
     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,
                    "http2 lingering close handler");
 
-    if (rev->timedout) {
+    if (rev->timedout || c->close) {
         ngx_http_close_connection(c);
         return;
     }