]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: session: close new idle conns if server in maintenance
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 21 Aug 2025 16:42:50 +0000 (18:42 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 28 Aug 2025 12:55:21 +0000 (14:55 +0200)
Previous patch ensures that a backend connection going into idle state
is rejected and freed if its target server is in maintenance.

This patch introduces a similar change for connections attached in the
session. session_check_idle_conn() now returns an errorl if connection
target server is in maintenance, similarly to session max idle conns
limit reached. This is sufficient to instruct muxes to delete the
connection immediately.

src/session.c

index 8f871f815c8f99139aa36a6ae5025d7a48f81abb..89f81fde8073eba8d350a97fa0eb511f1b549dbf 100644 (file)
@@ -705,6 +705,8 @@ int session_add_conn(struct session *sess, struct connection *conn)
  */
 int session_check_idle_conn(struct session *sess, struct connection *conn)
 {
+       struct server *srv = objt_server(conn->target);
+
        /* Connection must be attached to session prior to this function call. */
        BUG_ON(!conn->owner || conn->owner != sess);
 
@@ -715,7 +717,8 @@ int session_check_idle_conn(struct session *sess, struct connection *conn)
        /* Ensure conn is not already accounted as idle to prevent sess idle count excess increment. */
        BUG_ON(conn->flags & CO_FL_SESS_IDLE);
 
-       if (sess->idle_conns >= sess->fe->max_out_conns) {
+       if (sess->idle_conns >= sess->fe->max_out_conns ||
+           (srv && (srv->cur_admin & SRV_ADMF_MAINT))) {
                session_unown_conn(sess, conn);
                conn->owner = NULL;
                return -1;