Skip to content

Commit e3bd220

Browse files
committed
MAJOR: mux_quic: open bwnd earlier on FIN sent
1 parent 08aa123 commit e3bd220

4 files changed

Lines changed: 32 additions & 9 deletions

File tree

include/haproxy/quic_stream-t.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ struct qc_stream_buf {
2525

2626
#define QC_SD_FL_RELEASE 0x00000001 /* set when MUX has finished to use this stream */
2727
#define QC_SD_FL_WAIT_FOR_FIN 0x00000002 /* set if sent FIN is waiting for acknowledgement */
28+
#define QC_SD_FL_FINALIZED 0x00000004
2829

2930
/* QUIC STREAM descriptor.
3031
*

include/haproxy/quic_stream.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ struct buffer *qc_stream_buf_alloc(struct qc_stream_desc *stream,
2121
uint64_t offset, int small);
2222
struct buffer *qc_stream_buf_realloc(struct qc_stream_desc *stream);
2323
void qc_stream_buf_release(struct qc_stream_desc *stream);
24+
void qc_stream_buf_finalize(struct qc_stream_desc *stream);
2425

2526
/* Returns true if nothing to ack yet for stream <s> including FIN bit. */
2627
static inline int qc_stream_desc_done(const struct qc_stream_desc *s)

src/mux_quic.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -696,11 +696,12 @@ static void qcm_ctrl_send(struct qc_stream_desc *stream, uint64_t data, uint64_t
696696
QMUX_EV_QCS_SEND, qcc->conn, qcs);
697697
}
698698
/* Release buffer if everything sent and buf is full or stream is waiting for room. */
699-
if (!qcs_prep_bytes(qcs) &&
700-
(b_full(&qcs->tx.stream->buf->buf) || qcs->flags & QC_SF_BLK_MROOM)) {
701-
qc_stream_buf_release(qcs->tx.stream);
702-
qcs->flags &= ~QC_SF_BLK_MROOM;
703-
qcs_notify_send(qcs);
699+
if (!qcs_prep_bytes(qcs)) {
700+
if (b_full(&qcs->tx.stream->buf->buf) || qcs->flags & QC_SF_BLK_MROOM) {
701+
qc_stream_buf_release(qcs->tx.stream);
702+
qcs->flags &= ~QC_SF_BLK_MROOM;
703+
qcs_notify_send(qcs);
704+
}
704705
}
705706

706707
/* Add measurement for send rate. This is done at the MUX layer
@@ -4471,6 +4472,7 @@ static size_t qcm_strm_snd_buf(struct stconn *sc, struct buffer *buf,
44714472
if (fin) {
44724473
TRACE_STATE("reached stream fin", QMUX_EV_STRM_SEND, qcs->qcc->conn, qcs);
44734474
qcs->flags |= QC_SF_FIN_STREAM;
4475+
qc_stream_buf_finalize(qcs->tx.stream);
44744476
}
44754477

44764478
if (ret || fin) {
@@ -4589,6 +4591,7 @@ static size_t qcm_strm_done_ff(struct stconn *sc)
45894591
if (sd->iobuf.flags & IOBUF_FL_EOI) {
45904592
TRACE_STATE("reached stream fin", QMUX_EV_STRM_SEND, qcs->qcc->conn, qcs);
45914593
qcs->flags |= QC_SF_FIN_STREAM;
4594+
qc_stream_buf_finalize(qcs->tx.stream);
45924595
}
45934596

45944597
if (!(qcs->flags & QC_SF_FIN_STREAM) && !sd->iobuf.data) {

src/quic_stream.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static void qc_stream_buf_free(struct qc_stream_desc *stream,
2727

2828
eb64_delete(&(*stream_buf)->offset_node);
2929

30-
if (*stream_buf == stream->buf) {
30+
if (*stream_buf == stream->buf && !(stream->flags & QC_SD_FL_FINALIZED)) {
3131
/* Reset current buffer ptr. */
3232
stream->buf = NULL;
3333
room = b_size(buf);
@@ -130,7 +130,7 @@ void qc_stream_desc_release(struct qc_stream_desc *stream,
130130
*/
131131
if (!b_data(buf))
132132
qc_stream_buf_free(stream, &stream_buf);
133-
else
133+
else if (!(stream->flags & QC_SD_FL_FINALIZED))
134134
qc_stream_buf_release(stream);
135135
}
136136

@@ -231,8 +231,10 @@ static int qc_stream_buf_store_ack(struct qc_stream_buf *buf,
231231
}
232232

233233
buf->room += newly_acked;
234-
if (stream->notify_room && qc_stream_buf_is_released(buf, stream))
234+
if (stream->notify_room &&
235+
(qc_stream_buf_is_released(buf, stream) || stream->flags & QC_SD_FL_FINALIZED)) {
235236
stream->notify_room(stream, newly_acked);
237+
}
236238

237239
end:
238240
return newly_acked;
@@ -262,7 +264,8 @@ static struct qc_stream_buf *qc_stream_buf_ack(struct qc_stream_buf *buf,
262264
bdata_ctr_del(&stream->data, diff);
263265

264266
/* notify room from acked data if buffer has been released. */
265-
if (stream->notify_room && qc_stream_buf_is_released(buf, stream)) {
267+
if (stream->notify_room &&
268+
(qc_stream_buf_is_released(buf, stream) || stream->flags & QC_SD_FL_FINALIZED)) {
266269
if (diff >= buf->room) {
267270
diff -= buf->room;
268271
buf->room = 0;
@@ -516,6 +519,8 @@ void qc_stream_buf_release(struct qc_stream_desc *stream)
516519
/* current buffer already released */
517520
BUG_ON(!stream->buf);
518521

522+
BUG_ON(stream->flags & QC_SD_FL_FINALIZED);
523+
519524
room = b_room(&stream->buf->buf) + stream->buf->room;
520525
stream->buf = NULL;
521526
stream->buf_offset = 0;
@@ -526,3 +531,16 @@ void qc_stream_buf_release(struct qc_stream_desc *stream)
526531
if (stream->notify_room && room)
527532
stream->notify_room(stream, room);
528533
}
534+
535+
void qc_stream_buf_finalize(struct qc_stream_desc *stream)
536+
{
537+
uint64_t room;
538+
539+
/* current buffer already released */
540+
BUG_ON(!stream->buf);
541+
542+
room = b_room(&stream->buf->buf) + stream->buf->room;
543+
if (stream->notify_room && room)
544+
stream->notify_room(stream, room);
545+
stream->flags |= QC_SD_FL_FINALIZED;
546+
}

0 commit comments

Comments
 (0)