From 5e8eb3661bd41702bb77ff3f99097c386c6057e6 Mon Sep 17 00:00:00 2001 From: Amaury Denoyelle Date: Wed, 20 Mar 2024 15:51:09 +0100 Subject: [PATCH] MEDIUM: mux: prepare for takeover on private connections When a backend connection is marked as idle, a special flag TASK_F_USR1 is set on MUX tasklet. When MUX tasklet is reactivated, extra checks are executed under this flag to ensure no takeover occurred in the meantime. Previously, only non private connections could be targetted by a takeover. However, this will change when implementing private idle connections closure on "delete server" CLI handler. As such, TASK_F_USR1 is now also set for private connections in MUX detach callbacks. --- src/mux_fcgi.c | 4 ++++ src/mux_h1.c | 5 +++++ src/mux_h2.c | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/src/mux_fcgi.c b/src/mux_fcgi.c index ebd3032..617a9af 100644 --- a/src/mux_fcgi.c +++ b/src/mux_fcgi.c @@ -3581,6 +3581,10 @@ static void fcgi_detach(struct sedesc *sd) } } if (eb_is_empty(&fconn->streams_by_id)) { + /* mark that the tasklet may lose its context to another thread and + * that the handler needs to check it under the idle conns lock. + */ + HA_ATOMIC_OR(&fconn->wait_event.tasklet->state, TASK_F_USR1); if (session_check_idle_conn(fconn->conn->owner, fconn->conn) != 0) { /* The connection is destroyed, let's leave */ TRACE_DEVEL("outgoing connection killed", FCGI_EV_STRM_END|FCGI_EV_FCONN_ERR); diff --git a/src/mux_h1.c b/src/mux_h1.c index 8e9ec78..f26b4dc 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -1019,6 +1019,11 @@ static void h1s_finish_detach(struct h1s *h1s) goto end; } /* Always idle at this step */ + + /* mark that the tasklet may lose its context to another thread and + * that the handler needs to check it under the idle conns lock. + */ + HA_ATOMIC_OR(&h1c->wait_event.tasklet->state, TASK_F_USR1); if (session_check_idle_conn(sess, h1c->conn)) { /* The connection got destroyed, let's leave */ TRACE_DEVEL("outgoing connection killed", H1_EV_STRM_END|H1_EV_H1C_END); diff --git a/src/mux_h2.c b/src/mux_h2.c index e829c49..c01f61d 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -4819,6 +4819,10 @@ static void h2_detach(struct sedesc *sd) } } if (eb_is_empty(&h2c->streams_by_id)) { + /* mark that the tasklet may lose its context to another thread and + * that the handler needs to check it under the idle conns lock. + */ + HA_ATOMIC_OR(&h2c->wait_event.tasklet->state, TASK_F_USR1); if (session_check_idle_conn(h2c->conn->owner, h2c->conn) != 0) { /* At this point either the connection is destroyed, or it's been added to the server idle list, just stop */ TRACE_DEVEL("leaving without reusable idle connection", H2_EV_STRM_END); -- 1.7.10.4