aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVladimir Homutov <vl@nginx.com>2021-10-15 12:26:42 +0300
committerVladimir Homutov <vl@nginx.com>2021-10-15 12:26:42 +0300
commit0cd45dea762d3fff535dededf1a4490730f6e7f8 (patch)
tree9e21bb4fa6c3d3304120f7b80dbb1afb25b94457 /src
parentda28a4c6267b8b29d9188f89ab8fad6de08ea688 (diff)
downloadnginx-0cd45dea762d3fff535dededf1a4490730f6e7f8.tar.gz
nginx-0cd45dea762d3fff535dededf1a4490730f6e7f8.zip
QUIC: optimized ack range processing.
The sent queue is sorted by packet number. It is possible to avoid traversing full queue while handling ack ranges. It makes sense to start traversing from the queue head (i.e. check oldest packets first).
Diffstat (limited to 'src')
-rw-r--r--src/event/quic/ngx_event_quic_ack.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/event/quic/ngx_event_quic_ack.c b/src/event/quic/ngx_event_quic_ack.c
index 3e4bb6d4f..22697ccb6 100644
--- a/src/event/quic/ngx_event_quic_ack.c
+++ b/src/event/quic/ngx_event_quic_ack.c
@@ -223,14 +223,18 @@ ngx_quic_handle_ack_frame_range(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
st->max_pn = NGX_TIMER_INFINITE;
found = 0;
- q = ngx_queue_last(&ctx->sent);
+ q = ngx_queue_head(&ctx->sent);
while (q != ngx_queue_sentinel(&ctx->sent)) {
f = ngx_queue_data(q, ngx_quic_frame_t, queue);
- q = ngx_queue_prev(q);
+ q = ngx_queue_next(q);
+
+ if (f->pnum > max) {
+ break;
+ }
- if (f->pnum >= min && f->pnum <= max) {
+ if (f->pnum >= min) {
ngx_quic_congestion_ack(c, f);
switch (f->type) {