# HG changeset patch # User Maxim Dounin # Date 1613069531 -10800 # Node ID 6d98f29867e8b24ccf6f35116fae4a5ce903a491 # Parent 3e83336cda5b66ecd311a3ffeda76868194fb3fe Additional connections reuse. If ngx_drain_connections() fails to immediately reuse any connections and there are no free connections, it now additionally tries to reuse a connection again. This helps to provide at least one free connection in case of HTTP/2 with lingering close, where merely trying to reuse a connection once does not free it, but makes it reusable again, waiting for lingering close. diff -r 3e83336cda5b -r 6d98f29867e8 src/core/ngx_connection.c --- a/src/core/ngx_connection.c Thu Feb 11 21:52:09 2021 +0300 +++ b/src/core/ngx_connection.c Thu Feb 11 21:52:11 2021 +0300 @@ -1310,6 +1310,7 @@ cycle->connection_n); } + c = NULL; n = ngx_max(ngx_min(32, cycle->reusable_connections_n / 8), 1); for (i = 0; i < n; i++) { @@ -1326,6 +1327,21 @@ c->close = 1; c->read->handler(c->read); } + + if (cycle->free_connection_n == 0 && c && c->reusable) { + + /* + * if no connections were freed, try to reuse the last + * connection again: this should free it as long as + * previous reuse moved it to lingering close + */ + + ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0, + "reusing connection again"); + + c->close = 1; + c->read->handler(c->read); + } }