]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: session: release the listener with the session, not the stream
authorWilly Tarreau <w@1wt.eu>
Wed, 18 Oct 2017 13:01:14 +0000 (15:01 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 31 Oct 2017 17:03:24 +0000 (18:03 +0100)
Since multiple streams can share one session attached to one listener,
the listener_release() call must be done in session_free() and not in
stream_free(), otherwise we end up with a negative count in H2.

src/session.c
src/stream.c

index 6c7399dd4ba22ef176060d2e90bab5d47f1403e0..cbc8a5ebdcfb80565d0a1888100abc37f4150b6c 100644 (file)
@@ -65,6 +65,8 @@ struct session *session_new(struct proxy *fe, struct listener *li, enum obj_type
 void session_free(struct session *sess)
 {
        HA_ATOMIC_SUB(&sess->fe->feconn, 1);
+       if (sess->listener)
+               listener_release(sess->listener);
        session_store_counters(sess);
        vars_prune_per_sess(&sess->vars);
        pool_free2(pool2_session, sess);
@@ -361,8 +363,6 @@ static void session_kill_embryonic(struct session *sess)
        conn_full_close(conn);
        conn_free(conn);
 
-       listener_release(sess->listener);
-
        task_delete(task);
        task_free(task);
        session_free(sess);
index 5a5adb7f8eb8391616f9398ce9b9cf7c5bee0c61..b1c2b04f94d48e5ec018eca06186fe20c6439cee 100644 (file)
@@ -2455,9 +2455,6 @@ struct task *process_stream(struct task *t)
        if (s->flags & SF_BE_ASSIGNED)
                HA_ATOMIC_SUB(&s->be->beconn, 1);
 
-       if (sess->listener)
-               listener_release(sess->listener);
-
        if (unlikely((global.mode & MODE_DEBUG) &&
                     (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) {
                chunk_printf(&trash, "%08x:%s.closed[%04x:%04x]\n",