]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: connections: Don't forget to decrement idle connection counters.
authorOlivier Houchard <ohouchard@haproxy.com>
Thu, 19 Mar 2020 22:52:28 +0000 (23:52 +0100)
committerOlivier Houchard <cognet@ci0.org>
Thu, 19 Mar 2020 22:56:08 +0000 (23:56 +0100)
In conn_backend_get(), when we manage to get an idle connection from the
current thread's pool, don't forget to decrement the idle connection
counters, or we may end up not reusing connections when we could, and/or
killing connections when we shouldn't.

src/backend.c

index 96d8d17ad8dda012274290ad77ac89818f387f20..8f81c610279c6f6e8e64af0682bc5b9d7193692d 100644 (file)
@@ -1095,8 +1095,10 @@ static struct connection *conn_backend_get(struct server *srv, int is_safe)
        /* If we found a connection in our own list, and we don't have to
         * steal one from another thread, then we're done.
         */
-       if (conn)
-               return conn;
+       if (conn) {
+               i = tid;
+               goto fix_conn;
+       }
 
        /* Lookup all other threads for an idle connection, starting from tid + 1 */
        for (i = tid; !found && (i = ((i + 1 == global.nbthread) ? 0 : i + 1)) != tid;) {
@@ -1116,6 +1118,7 @@ static struct connection *conn_backend_get(struct server *srv, int is_safe)
        if (!found)
                conn = NULL;
        else {
+fix_conn:
                conn->idle_time = 0;
                _HA_ATOMIC_SUB(&srv->curr_idle_conns, 1);
                _HA_ATOMIC_SUB(&srv->curr_idle_thr[i], 1);