mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-18 01:14:38 +00:00
BUG/MINOR: mux-quic: report glitches to session
Glitch counter was implemented for QUIC/HTTP3. The counter is stored in the QCC MUX connection instance. However, this is never reported at the session level which is necessary if glitch counter is tracked via a stick-table. To fix this, use session_add_glitch_ctr() in various QUIC MUX functions which may increment glitch counter. This should be backported up to 3.0.
This commit is contained in:
parent
2c783c25d6
commit
fcd6d29acf
@ -22,6 +22,7 @@
|
||||
#include <haproxy/quic_sock.h>
|
||||
#include <haproxy/quic_stream.h>
|
||||
#include <haproxy/quic_tp-t.h>
|
||||
#include <haproxy/session.h>
|
||||
#include <haproxy/ssl_sock-t.h>
|
||||
#include <haproxy/stconn.h>
|
||||
#include <haproxy/time.h>
|
||||
@ -974,6 +975,7 @@ static int qcc_decode_qcs(struct qcc *qcc, struct qcs *qcs)
|
||||
struct buffer b;
|
||||
ssize_t ret;
|
||||
int fin = 0;
|
||||
int prev_glitches = qcc->glitches;
|
||||
|
||||
TRACE_ENTER(QMUX_EV_QCS_RECV, qcc->conn, qcs);
|
||||
|
||||
@ -985,6 +987,10 @@ static int qcc_decode_qcs(struct qcc *qcc, struct qcs *qcs)
|
||||
|
||||
if (!(qcs->flags & QC_SF_READ_ABORTED)) {
|
||||
ret = qcc->app_ops->rcv_buf(qcs, &b, fin);
|
||||
|
||||
if (qcc->glitches != prev_glitches)
|
||||
session_add_glitch_ctr(qcc->conn->owner, qcc->glitches - prev_glitches);
|
||||
|
||||
if (ret < 0) {
|
||||
TRACE_ERROR("decoding error", QMUX_EV_QCS_RECV, qcc->conn, qcs);
|
||||
goto err;
|
||||
@ -1566,6 +1572,7 @@ int qcc_recv_max_stream_data(struct qcc *qcc, uint64_t id, uint64_t max)
|
||||
int qcc_recv_reset_stream(struct qcc *qcc, uint64_t id, uint64_t err, uint64_t final_size)
|
||||
{
|
||||
struct qcs *qcs;
|
||||
int prev_glitches = qcc->glitches;
|
||||
|
||||
TRACE_ENTER(QMUX_EV_QCC_RECV, qcc->conn);
|
||||
|
||||
@ -1624,6 +1631,9 @@ int qcc_recv_reset_stream(struct qcc *qcc, uint64_t id, uint64_t err, uint64_t f
|
||||
qcs_free_ncbuf(qcs, &qcs->rx.ncbuf);
|
||||
|
||||
out:
|
||||
if (qcc->glitches != prev_glitches)
|
||||
session_add_glitch_ctr(qcc->conn->owner, qcc->glitches - prev_glitches);
|
||||
|
||||
TRACE_LEAVE(QMUX_EV_QCC_RECV, qcc->conn);
|
||||
return 0;
|
||||
|
||||
@ -1641,6 +1651,7 @@ int qcc_recv_reset_stream(struct qcc *qcc, uint64_t id, uint64_t err, uint64_t f
|
||||
int qcc_recv_stop_sending(struct qcc *qcc, uint64_t id, uint64_t err)
|
||||
{
|
||||
struct qcs *qcs;
|
||||
int prev_glitches = qcc->glitches;
|
||||
|
||||
TRACE_ENTER(QMUX_EV_QCC_RECV, qcc->conn);
|
||||
|
||||
@ -1726,6 +1737,9 @@ int qcc_recv_stop_sending(struct qcc *qcc, uint64_t id, uint64_t err)
|
||||
qcc_refresh_timeout(qcc);
|
||||
|
||||
out:
|
||||
if (qcc->glitches != prev_glitches)
|
||||
session_add_glitch_ctr(qcc->conn->owner, qcc->glitches - prev_glitches);
|
||||
|
||||
TRACE_LEAVE(QMUX_EV_QCC_RECV, qcc->conn);
|
||||
return 0;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user