From: Vladimir Homutov Date: Mon, 26 Oct 2020 21:14:24 +0000 (+0300) Subject: QUIC: cleanup send context properly. X-Git-Tag: release-1.25.0~4^2~497 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=68f7e9540a0852bc69453058ae7588c77a3a1494;p=nginx.git QUIC: cleanup send context properly. The patch resets ctx->frames queue, which may contain frames. It was possible that congestion or amplification limits prevented all frames to be sent. Retransmitted frames could be accounted twice as inflight: first time in ngx_quic_congestion_lost() called from ngx_quic_resend_frames(), and later from ngx_quic_discard_ctx(). --- diff --git a/src/event/ngx_event_quic.c b/src/event/ngx_event_quic.c index dcdea293c..5cffeaebc 100644 --- a/src/event/ngx_event_quic.c +++ b/src/event/ngx_event_quic.c @@ -2254,6 +2254,15 @@ ngx_quic_discard_ctx(ngx_connection_t *c, enum ssl_encryption_level_t level) ngx_quic_free_frame(c, f); } + while (!ngx_queue_empty(&ctx->frames)) { + q = ngx_queue_head(&ctx->frames); + ngx_queue_remove(q); + + f = ngx_queue_data(q, ngx_quic_frame_t, queue); + ngx_quic_congestion_ack(c, f); + ngx_quic_free_frame(c, f); + } + ctx->send_ack = 0; } @@ -5677,6 +5686,7 @@ ngx_quic_congestion_lost(ngx_connection_t *c, ngx_quic_frame_t *f) cg = &qc->congestion; cg->in_flight -= f->plen; + f->plen = 0; timer = f->last - cg->recovery_start;