From: Amaury Denoyelle Date: Wed, 23 Sep 2026 12:31:37 +0000 (+0200) Subject: BUG/MINOR: mux_quic: prevent purgeable QCS lingering X-Git-Tag: v3.5-dev9~182 X-Git-Url: https://git.kaiwu.me/?a=commitdiff_plain;h=efc9402388fb7386c62e9373902a8c8edddca52f;p=haproxy.git BUG/MINOR: mux_quic: prevent purgeable QCS lingering Ensure QCC tasklet is woken up when a QCS is inserted in the purge list. The objective is to prevent keeping QCS for too long in it. Changes are only necessary when running outside of QCC tasklet. Thus new wakeup are only inserted in receive handlers to avoid unnecessary tasklet execution. Prior to this patch, a purgeable QCS could have been kept virtually indefinitely. This probably did not really happen as QCC tasklet is frequently woken after frames handling. This should be backported up to 3.2, after a period of observation. --- diff --git a/src/mux_quic.c b/src/mux_quic.c index 19fb5c0cc..720ef9370 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -2149,6 +2149,10 @@ int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset, return 0; } + /* Wakeup tasklet if QCS inserted in purge list. May happen after remote closure. */ + if (qcs_is_completed(qcs)) + tasklet_wakeup(qcc->wait_event.tasklet); + out: TRACE_LEAVE(QMUX_EV_QCC_RECV, qcc->conn); return 0; @@ -2366,6 +2370,9 @@ int qcc_recv_reset_stream(struct qcc *qcc, uint64_t id, uint64_t err, uint64_t f qcs->flags |= QC_SF_SIZE_KNOWN|QC_SF_RECV_RESET; qcs_close_remote(qcs); + /* Wakeup tasklet if QCS inserted in purge list. May happen after remote closure. */ + if (qcs_is_completed(qcs)) + tasklet_wakeup(qcc->wait_event.tasklet); /* RFC 9000 3.2. Receiving Stream States *