mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-23 06:41:32 +02:00
MINOR: quic: decode as much STREAM as possible
Add a loop in the bidi STREAM function. This will call repeatdly qcc_decode_qcs() and dequeue buffered frames. This is useful when reception of more data is interrupted because the MUX buffer was full. qcc_decode_qcs() has probably free some space so it is useful to immediatly retry reception of buffered frames of the qcs tree. This may fix occurences of stalled Rx transfers with large payload. Note however that there is still room for improvment. The conn-stream layer is not able at this moment to retrigger demuxing. This is because the mux io-handler does not treat Rx : this may continue to cause stalled tranfers.
This commit is contained in:
parent
48f01bda86
commit
03cc62c840
4
src/h3.c
4
src/h3.c
@ -321,6 +321,10 @@ static int h3_decode_qcs(struct qcs *qcs, int fin, void *ctx)
|
|||||||
h3s->demux_frame_len -= ret;
|
h3s->demux_frame_len -= ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO may be useful to wakeup the MUX if blocked due to full buffer.
|
||||||
|
* However, currently, io-cb of MUX does not handle Rx.
|
||||||
|
*/
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2139,7 +2139,7 @@ static int qc_handle_bidi_strm_frm(struct quic_rx_packet *pkt,
|
|||||||
struct quic_rx_strm_frm *frm;
|
struct quic_rx_strm_frm *frm;
|
||||||
struct eb64_node *frm_node;
|
struct eb64_node *frm_node;
|
||||||
struct qcs *qcs = NULL;
|
struct qcs *qcs = NULL;
|
||||||
size_t done;
|
size_t done, buf_was_full;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = qcc_recv(qc->qcc, strm_frm->id, strm_frm->len,
|
ret = qcc_recv(qc->qcc, strm_frm->id, strm_frm->len,
|
||||||
@ -2176,6 +2176,13 @@ static int qc_handle_bidi_strm_frm(struct quic_rx_packet *pkt,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Decode the data if buffer is already full as it's not possible to
|
||||||
|
* dequeue a frame in this condition.
|
||||||
|
*/
|
||||||
|
if (b_full(&qcs->rx.buf))
|
||||||
|
qcc_decode_qcs(qc->qcc, qcs);
|
||||||
|
|
||||||
|
retry:
|
||||||
/* Frame received (partially or not) by the mux.
|
/* Frame received (partially or not) by the mux.
|
||||||
* If there is buffered frame for next offset, it may be possible to
|
* If there is buffered frame for next offset, it may be possible to
|
||||||
* receive them now.
|
* receive them now.
|
||||||
@ -2212,9 +2219,17 @@ static int qc_handle_bidi_strm_frm(struct quic_rx_packet *pkt,
|
|||||||
pool_free(pool_head_quic_rx_strm_frm, frm);
|
pool_free(pool_head_quic_rx_strm_frm, frm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buf_was_full = b_full(&qcs->rx.buf);
|
||||||
/* Decode the received data. */
|
/* Decode the received data. */
|
||||||
qcc_decode_qcs(qc->qcc, qcs);
|
qcc_decode_qcs(qc->qcc, qcs);
|
||||||
|
|
||||||
|
/* Buffer was full so the reception was stopped. Now the buffer has
|
||||||
|
* space available thanks to qcc_decode_qcs(). We can now retry to
|
||||||
|
* handle more data.
|
||||||
|
*/
|
||||||
|
if (buf_was_full && !b_full(&qcs->rx.buf))
|
||||||
|
goto retry;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user