Welcome! Log In Create A New Profile

Advanced

[nginx] HTTP/2: reused HEADERS and CONTINUATION frames buffers.

Valentin Bartenev
November 13, 2015 12:14PM
details: http://hg.nginx.org/nginx/rev/ec6b07be88a5
branches:
changeset: 6293:ec6b07be88a5
user: Valentin Bartenev <vbart@nginx.com>
date: Fri Nov 13 20:10:50 2015 +0300
description:
HTTP/2: reused HEADERS and CONTINUATION frames buffers.

diffstat:

src/http/v2/ngx_http_v2.h | 2 +-
src/http/v2/ngx_http_v2_filter_module.c | 29 ++++++++++++++++++++---------
2 files changed, 21 insertions(+), 10 deletions(-)

diffs (103 lines):

diff -r f72d3129cd35 -r ec6b07be88a5 src/http/v2/ngx_http_v2.h
--- a/src/http/v2/ngx_http_v2.h Fri Nov 13 20:10:50 2015 +0300
+++ b/src/http/v2/ngx_http_v2.h Fri Nov 13 20:10:50 2015 +0300
@@ -178,7 +178,7 @@ struct ngx_http_v2_stream_s {
size_t recv_window;

ngx_http_v2_out_frame_t *free_frames;
- ngx_chain_t *free_data_headers;
+ ngx_chain_t *free_frame_headers;
ngx_chain_t *free_bufs;

ngx_queue_t queue;
diff -r f72d3129cd35 -r ec6b07be88a5 src/http/v2/ngx_http_v2_filter_module.c
--- a/src/http/v2/ngx_http_v2_filter_module.c Fri Nov 13 20:10:50 2015 +0300
+++ b/src/http/v2/ngx_http_v2_filter_module.c Fri Nov 13 20:10:50 2015 +0300
@@ -624,6 +624,8 @@ ngx_http_v2_create_headers_frame(ngx_htt
*b->last++ = flags;
b->last = ngx_http_v2_write_sid(b->last, stream->node->id);

+ b->tag = (ngx_buf_tag_t) &ngx_http_v2_module;
+
cl = ngx_alloc_chain_link(r->pool);
if (cl == NULL) {
return NULL;
@@ -929,7 +931,7 @@ ngx_http_v2_filter_get_data_frame(ngx_ht
stream->node->id, frame, len, (ngx_uint_t) flags);

cl = ngx_chain_get_free_buf(stream->request->pool,
- &stream->free_data_headers);
+ &stream->free_frame_headers);
if (cl == NULL) {
return NULL;
}
@@ -946,7 +948,7 @@ ngx_http_v2_filter_get_data_frame(ngx_ht
buf->end = buf->start + NGX_HTTP_V2_FRAME_HEADER_SIZE;
buf->last = buf->end;

- buf->tag = (ngx_buf_tag_t) &ngx_http_v2_filter_get_data_frame;
+ buf->tag = (ngx_buf_tag_t) &ngx_http_v2_module;
buf->memory = 1;
}

@@ -1054,7 +1056,7 @@ static ngx_int_t
ngx_http_v2_headers_frame_handler(ngx_http_v2_connection_t *h2c,
ngx_http_v2_out_frame_t *frame)
{
- ngx_chain_t *cl;
+ ngx_chain_t *cl, *ln;
ngx_http_v2_stream_t *stream;

stream = frame->stream;
@@ -1071,19 +1073,28 @@ ngx_http_v2_headers_frame_handler(ngx_ht
return NGX_AGAIN;
}

+ ln = cl->next;
+
+ if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_module) {
+ cl->next = stream->free_frame_headers;
+ stream->free_frame_headers = cl;
+
+ } else {
+ cl->next = stream->free_bufs;
+ stream->free_bufs = cl;
+ }
+
if (cl == frame->last) {
break;
}

- cl = cl->next;
+ cl = ln;
}

ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
"http2:%ui HEADERS frame %p was sent",
stream->node->id, frame);

- ngx_free_chain(stream->request->pool, frame->first);
-
ngx_http_v2_handle_frame(stream, frame);

ngx_http_v2_handle_stream(h2c, stream);
@@ -1104,7 +1115,7 @@ ngx_http_v2_data_frame_handler(ngx_http_

cl = frame->first;

- if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_data_frame) {
+ if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_module) {

if (cl->buf->pos != cl->buf->last) {
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
@@ -1116,8 +1127,8 @@ ngx_http_v2_data_frame_handler(ngx_http_

ln = cl->next;

- cl->next = stream->free_data_headers;
- stream->free_data_headers = cl;
+ cl->next = stream->free_frame_headers;
+ stream->free_frame_headers = cl;

if (cl == frame->last) {
goto done;

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] HTTP/2: reused HEADERS and CONTINUATION frames buffers.

Valentin Bartenev 437 November 13, 2015 12:14PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 311
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready