mirror of
http://git.haproxy.org/git/haproxy.git
synced 2026-02-14 09:29:08 +02:00
MAJOR: mux-quic: rework stream sending priorization
Implement a mechanism to register streams ready to send data in new STREAM frames. Internally, this is implemented with a new list <qcc.send_list> which contains qcs instances. A qcs can be registered safely using the new function qcc_send_stream(). This is done automatically in qc_send_buf() which covers most cases. Also, application layer is free to use it for internal usage streams. This is currently the case for H3 control stream with SETTINGS sending. The main point of this patch is to handle stream sending fairly. This is in stark contrast with previous code where streams with lower ID were always prioritized. This could cause other streams to be indefinitely blocked behind a stream which has a lot of data to transfer. Now, streams are handled in an order scheduled by se_desc layer. This commit is the first one of a serie which will bring other improvments which also relied on the send_list implementation. This must be backported up to 2.7 when deemed sufficiently stable.
This commit is contained in:
@@ -95,6 +95,7 @@ struct qcc {
|
||||
struct eb_root streams_by_id; /* all active streams by their ID */
|
||||
|
||||
struct list send_retry_list; /* list of qcs eligible to send retry */
|
||||
struct list send_list; /* list of qcs ready to send */
|
||||
|
||||
struct wait_event wait_event; /* To be used if we're waiting for I/Os */
|
||||
|
||||
@@ -174,6 +175,7 @@ struct qcs {
|
||||
struct qc_stream_desc *stream;
|
||||
|
||||
struct list el; /* element of qcc.send_retry_list */
|
||||
struct list el_send; /* element of qcc.send_list */
|
||||
struct list el_opening; /* element of qcc.opening_list */
|
||||
|
||||
struct wait_event wait_event;
|
||||
|
||||
@@ -21,6 +21,7 @@ void qcs_notify_send(struct qcs *qcs);
|
||||
|
||||
void qcc_emit_cc_app(struct qcc *qcc, int err, int immediate);
|
||||
void qcc_reset_stream(struct qcs *qcs, int err);
|
||||
void qcc_send_stream(struct qcs *qcs);
|
||||
void qcc_abort_stream_read(struct qcs *qcs);
|
||||
int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset,
|
||||
char fin, char *data);
|
||||
|
||||
Reference in New Issue
Block a user