From: Amaury Denoyelle Date: Tue, 30 Jun 2026 16:29:50 +0000 (+0200) Subject: MINOR: mux_quic: adjust shut stream callback X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/static/gitweb.js?a=commitdiff_plain;h=cc56803799763de618aad9b6880eac518270cc3a;p=haproxy.git MINOR: mux_quic: adjust shut stream callback Clean up MUX QUIC stream shut callback with a central invokation for lclose app_ops. Also, traces are added at H3 layer to log the method of closure. --- diff --git a/src/h3.c b/src/h3.c index 3a1eb1124..32d8f33da 100644 --- a/src/h3.c +++ b/src/h3.c @@ -3289,19 +3289,23 @@ static void h3_lclose(struct qcs *qcs, enum qcc_app_ops_lclose_mode mode) * the connection with H3_FRAME_UNEXPECTED. */ if (qcs->tx.fc.off_soft) { + TRACE_STATE("close stream with empty fin", H3_EV_H3S_END, qcs->qcc->conn, qcs); qcs->flags |= QC_SF_FIN_STREAM; qcc_send_stream(qcs, 0, 0); } else { - qcc_reset_stream(qcs, 0, se_tevt_type_shutw); + TRACE_STATE("reset stream as no content emitted yet", H3_EV_H3S_END, qcs->qcc->conn, qcs); + qcc_reset_stream(qcs, H3_ERR_REQUEST_CANCELLED, se_tevt_type_shutw); } break; case QCC_APP_OPS_LCLO_MODE_ABORT: + TRACE_STATE("cancel stream", H3_EV_H3S_END, qcs->qcc->conn, qcs); qcc_reset_stream(qcs, H3_ERR_REQUEST_CANCELLED, se_tevt_type_cancelled); break; case QCC_APP_OPS_LCLO_MODE_KILL_CONN: + TRACE_STATE("kill stream", H3_EV_H3S_END, qcs->qcc->conn, qcs); qcc_reset_stream(qcs, H3_ERR_EXCESSIVE_LOAD, se_tevt_type_cancelled); if (!(qcs->qcc->flags & (QC_CF_ERR_CONN|QC_CF_ERRL))) { qcc_set_error(qcs->qcc, H3_ERR_EXCESSIVE_LOAD, 1, diff --git a/src/mux_quic.c b/src/mux_quic.c index ae6c2da0d..6960c5994 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -4704,6 +4704,7 @@ static void qcm_strm_shut(struct stconn *sc, unsigned int mode, struct se_abort_ { struct qcs *qcs = __sc_mux_strm(sc); struct qcc *qcc = qcs->qcc; + enum qcc_app_ops_lclose_mode lclo_mode; if (!(mode & (SE_SHW_SILENT|SE_SHW_NORMAL))) return; @@ -4713,12 +4714,15 @@ static void qcm_strm_shut(struct stconn *sc, unsigned int mode, struct se_abort_ /* Early closure reported if QC_SF_FIN_STREAM not yet set. */ if (!qcs_is_close_local(qcs) && !(qcs->flags & (QC_SF_FIN_STREAM|QC_SF_TO_RESET))) { + if (qcs->flags & QC_SF_UNKNOWN_PL_LENGTH) - qcc->app_ops->lclose(qcs, QCC_APP_OPS_LCLO_MODE_NORMAL); + lclo_mode = QCC_APP_OPS_LCLO_MODE_NORMAL; else if (se_fl_test(qcs->sd, SE_FL_KILL_CONN)) - qcc->app_ops->lclose(qcs, QCC_APP_OPS_LCLO_MODE_KILL_CONN); + lclo_mode = QCC_APP_OPS_LCLO_MODE_KILL_CONN; else - qcc->app_ops->lclose(qcs, QCC_APP_OPS_LCLO_MODE_ABORT); + lclo_mode = QCC_APP_OPS_LCLO_MODE_ABORT; + + qcc->app_ops->lclose(qcs, lclo_mode); tasklet_wakeup(qcc->wait_event.tasklet); }