QUIC: optimize insertion at the end of QUIC buffer.

This commit is contained in:
Roman Arutyunyan 2022-02-14 14:54:34 +03:00
parent ab1adbbc08
commit 418ce3b294
2 changed files with 21 additions and 2 deletions

View File

@ -51,7 +51,9 @@ typedef enum {
typedef struct { typedef struct {
uint64_t size; uint64_t size;
uint64_t offset; uint64_t offset;
uint64_t last_offset;
ngx_chain_t *chain; ngx_chain_t *chain;
ngx_chain_t **last_chain;
} ngx_quic_buffer_t; } ngx_quic_buffer_t;

View File

@ -421,6 +421,10 @@ ngx_quic_read_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, uint64_t limit)
qb->offset += n; qb->offset += n;
} }
if (qb->offset >= qb->last_offset) {
qb->last_chain = NULL;
}
qb->chain = *ll; qb->chain = *ll;
*ll = NULL; *ll = NULL;
@ -462,6 +466,10 @@ ngx_quic_skip_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb,
if (qb->chain == NULL) { if (qb->chain == NULL) {
qb->offset = offset; qb->offset = offset;
} }
if (qb->offset >= qb->last_offset) {
qb->last_chain = NULL;
}
} }
@ -493,8 +501,14 @@ ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb,
ngx_buf_t *b; ngx_buf_t *b;
ngx_chain_t *cl, **chain; ngx_chain_t *cl, **chain;
base = qb->offset; if (qb->last_chain && offset >= qb->last_offset) {
chain = &qb->chain; base = qb->last_offset;
chain = qb->last_chain;
} else {
base = qb->offset;
chain = &qb->chain;
}
while (in && limit) { while (in && limit) {
@ -585,6 +599,9 @@ ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb,
} }
} }
qb->last_offset = base;
qb->last_chain = chain;
return in; return in;
} }