HTTP: using r->mem_pool retention counter for response buffers.

This commit is contained in:
Igor Sysoev
2018-04-03 16:28:26 +03:00
parent 151160c110
commit fa04c05aa0
9 changed files with 154 additions and 50 deletions

View File

@@ -21,9 +21,12 @@ static void nxt_h1p_request_header_send(nxt_task_t *task,
nxt_http_request_t *r);
static void nxt_h1p_request_send(nxt_task_t *task, nxt_http_request_t *r,
nxt_buf_t *out);
nxt_inline void nxt_h1p_request_error(nxt_task_t *task, nxt_http_request_t *r);
static nxt_buf_t *nxt_h1p_chunk_create(nxt_task_t *task, nxt_http_request_t *r,
nxt_buf_t *out);
static void nxt_h1p_sent(nxt_task_t *task, void *obj, void *data);
static void nxt_h1p_request_discard(nxt_task_t *task, nxt_http_request_t *r,
nxt_buf_t *last);
static void nxt_h1p_request_close(nxt_task_t *task, nxt_http_proto_t proto);
static void nxt_h1p_keepalive(nxt_task_t *task, nxt_h1proto_t *h1p,
nxt_conn_t *c);
@@ -68,6 +71,13 @@ const nxt_http_proto_send_t nxt_http_proto_send[3] = {
};
const nxt_http_proto_discard_t nxt_http_proto_discard[3] = {
nxt_h1p_request_discard,
NULL,
NULL,
};
const nxt_http_proto_close_t nxt_http_proto_close[3] = {
nxt_h1p_request_close,
NULL,
@@ -687,11 +697,9 @@ nxt_h1p_request_header_send(nxt_task_t *task, nxt_http_request_t *r)
} nxt_list_loop;
header = nxt_buf_mem_alloc(r->mem_pool, size, 0);
header = nxt_http_buf_mem(task, r, size);
if (nxt_slow_path(header == NULL)) {
/* The internal server error is set just for logging. */
r->status = NXT_HTTP_INTERNAL_SERVER_ERROR;
nxt_h1p_conn_close(task, h1p->conn, h1p);
nxt_h1p_request_error(task, r);
return;
}
@@ -738,6 +746,13 @@ nxt_h1p_request_header_send(nxt_task_t *task, nxt_http_request_t *r)
}
nxt_inline void
nxt_h1p_request_error(nxt_task_t *task, nxt_http_request_t *r)
{
r->state->error_handler(task, r, r->proto.h1);
}
static const nxt_conn_state_t nxt_h1p_send_state
nxt_aligned(64) =
{
@@ -764,7 +779,7 @@ nxt_h1p_request_send(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out)
if (r->proto.h1->chunked) {
out = nxt_h1p_chunk_create(task, r, out);
if (nxt_slow_path(out == NULL)) {
nxt_h1p_conn_error(task, c, c->socket.data);
nxt_h1p_request_error(task, r);
return;
}
}
@@ -796,7 +811,7 @@ nxt_h1p_chunk_create(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out)
for (b = out; b != NULL; b = b->next) {
if (nxt_buf_is_last(b)) {
tail = nxt_buf_mem_alloc(r->mem_pool, chunk_size, 0);
tail = nxt_http_buf_mem(task, r, chunk_size);
if (nxt_slow_path(tail == NULL)) {
return NULL;
}
@@ -821,7 +836,7 @@ nxt_h1p_chunk_create(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out)
return out;
}
header = nxt_buf_mem_alloc(r->mem_pool, chunk_size, 0);
header = nxt_http_buf_mem(task, r, chunk_size);
if (nxt_slow_path(header == NULL)) {
return NULL;
}
@@ -853,6 +868,31 @@ nxt_h1p_sent(nxt_task_t *task, void *obj, void *data)
}
static void
nxt_h1p_request_discard(nxt_task_t *task, nxt_http_request_t *r,
nxt_buf_t *last)
{
nxt_buf_t *b;
nxt_conn_t *c;
nxt_h1proto_t *h1p;
nxt_work_queue_t *wq;
nxt_debug(task, "h1p request discard");
h1p = r->proto.h1;
h1p->keepalive = 0;
c = h1p->conn;
b = c->write;
c->write = NULL;
wq = &task->thread->engine->fast_work_queue;
nxt_sendbuf_drain(task, wq, b);
nxt_sendbuf_drain(task, wq, last);
}
static void
nxt_h1p_request_close(nxt_task_t *task, nxt_http_proto_t proto)
{
@@ -967,7 +1007,7 @@ nxt_h1p_conn_close(nxt_task_t *task, void *obj, void *data)
r = h1p->request;
if (r != NULL) {
r->state->error_handler(task, r, r->proto.h1);
nxt_h1p_request_error(task, r);
return;
}
}