# HG changeset patch # User Roman Arutyunyan # Date 1644839674 -10800 # Node ID 8d11e21716978223f37657001c9c0e7f8723be23 # Parent b5656025ddb5a49de70cf38c1a1a994155a910e8 QUIC: optimize insertion at the end of QUIC buffer. diff --git a/src/event/quic/ngx_event_quic.h b/src/event/quic/ngx_event_quic.h --- a/src/event/quic/ngx_event_quic.h +++ b/src/event/quic/ngx_event_quic.h @@ -51,7 +51,9 @@ typedef enum { typedef struct { uint64_t size; uint64_t offset; + uint64_t last_offset; ngx_chain_t *chain; + ngx_chain_t **last_chain; } ngx_quic_buffer_t; diff --git a/src/event/quic/ngx_event_quic_frames.c b/src/event/quic/ngx_event_quic_frames.c --- a/src/event/quic/ngx_event_quic_frames.c +++ b/src/event/quic/ngx_event_quic_frames.c @@ -421,6 +421,10 @@ ngx_quic_read_buffer(ngx_connection_t *c qb->offset += n; } + if (qb->offset >= qb->last_offset) { + qb->last_chain = NULL; + } + qb->chain = *ll; *ll = NULL; @@ -462,6 +466,10 @@ ngx_quic_skip_buffer(ngx_connection_t *c if (qb->chain == NULL) { qb->offset = offset; } + + if (qb->offset >= qb->last_offset) { + qb->last_chain = NULL; + } } @@ -493,8 +501,14 @@ ngx_quic_write_buffer(ngx_connection_t * ngx_buf_t *b; ngx_chain_t *cl, **chain; - base = qb->offset; - chain = &qb->chain; + if (qb->last_chain && offset >= qb->last_offset) { + base = qb->last_offset; + chain = qb->last_chain; + + } else { + base = qb->offset; + chain = &qb->chain; + } while (in && limit) { @@ -585,6 +599,9 @@ ngx_quic_write_buffer(ngx_connection_t * } } + qb->last_offset = base; + qb->last_chain = chain; + return in; }