]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: session: define flag to explicitely release listener on free
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Tue, 21 May 2024 14:44:26 +0000 (16:44 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Wed, 22 May 2024 08:01:57 +0000 (10:01 +0200)
When a session is allocated for a FE connection, session_free() is
responsible to call listener_release() to decrement listener connection
counters and resume listening.

Until now, <listener> member of session was tested inside session_free()
before invocating listener_release(). To highlight more explicitely the
relation between sessions and listeners, introduce a new flag
SESS_FL_RELEASE_LI. Only session with such flag set will invoke
listener_release() on their cleanup. Flag is set inside
session_accept_fd() on success.

This patch has no functional change. However, it will be useful to
implement session creation for rHTTP preconnect.

include/haproxy/session-t.h
src/session.c

index 8c59477df6b7270871969e69c55805d3b7069b4d..7f034dd5b3a9aca2af572bbbfb431210568060cc 100644 (file)
@@ -39,6 +39,7 @@
 enum {
        SESS_FL_NONE          = 0x00000000, /* nothing */
        SESS_FL_PREFER_LAST   = 0x00000001, /* NTML authent, we should reuse last conn */
+       SESS_FL_RELEASE_LI    = 0x00000002, /* session responsible to decrement listener counters on release */
 };
 
 /* max number of idle server connections kept attached to a session */
index fd5d60038d0f2075501aa159323fdb4d9802b0ea..d9cfa88199706848d93c60f5b1ce88eaf9b457d1 100644 (file)
@@ -78,8 +78,12 @@ void session_free(struct session *sess)
        struct connection *conn, *conn_back;
        struct sess_priv_conns *pconns, *pconns_back;
 
-       if (sess->listener)
+       if (sess->flags & SESS_FL_RELEASE_LI) {
+               /* listener must be set for session used to account FE conns. */
+               BUG_ON(!sess->listener);
                listener_release(sess->listener);
+       }
+
        session_store_counters(sess);
        pool_free(pool_head_stk_ctr, sess->stkctr);
        vars_prune_per_sess(&sess->vars);
@@ -285,12 +289,19 @@ int session_accept_fd(struct connection *cli_conn)
                sess->task->process = session_expire_embryonic;
                sess->task->expire  = tick_add_ifset(now_ms, timeout);
                task_queue(sess->task);
+
+               /* Session is responsible to decrement listener conns counters. */
+               sess->flags |= SESS_FL_RELEASE_LI;
+
                return 1;
        }
 
        /* OK let's complete stream initialization since there is no handshake */
-       if (conn_complete_session(cli_conn) >= 0)
+       if (conn_complete_session(cli_conn) >= 0) {
+               /* Session is responsible to decrement listener conns counters. */
+               sess->flags |= SESS_FL_RELEASE_LI;
                return 1;
+       }
 
        /* if we reach here we have deliberately decided not to keep this
         * session (e.g. tcp-request rule), so that's not an error we should
@@ -300,9 +311,9 @@ int session_accept_fd(struct connection *cli_conn)
 
        /* error unrolling */
  out_free_sess:
-        /* prevent call to listener_release during session_free. It will be
-         * done below, for all errors. */
-       sess->listener = NULL;
+       /* SESS_FL_RELEASE_LI must not be set here as listener_release() is
+        * called manually for all errors.
+        */
        session_free(sess);
 
  out_free_conn: