[nginx] Upstream: sendfile_max_chunk support.

Maxim Dounin mdounin at mdounin.ru
Fri Oct 29 20:20:25 UTC 2021


details:   https://hg.nginx.org/nginx/rev/862f6130d357
branches:  
changeset: 7949:862f6130d357
user:      Maxim Dounin <mdounin at mdounin.ru>
date:      Fri Oct 29 20:21:54 2021 +0300
description:
Upstream: sendfile_max_chunk support.

Previously, connections to upstream servers used sendfile() if it was
enabled, but never honored sendfile_max_chunk.  This might result
in worker monopolization for a long time if large request bodies
are allowed.

diffstat:

 src/core/ngx_output_chain.c  |  4 ++++
 src/http/ngx_http_upstream.c |  9 ++++++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diffs (43 lines):

diff -r a2613fc1bce5 -r 862f6130d357 src/core/ngx_output_chain.c
--- a/src/core/ngx_output_chain.c	Fri Oct 29 20:21:51 2021 +0300
+++ b/src/core/ngx_output_chain.c	Fri Oct 29 20:21:54 2021 +0300
@@ -803,6 +803,10 @@ ngx_chain_writer(void *data, ngx_chain_t
         return NGX_ERROR;
     }
 
+    if (chain && c->write->ready) {
+        ngx_post_event(c->write, &ngx_posted_next_events);
+    }
+
     for (cl = ctx->out; cl && cl != chain; /* void */) {
         ln = cl;
         cl = cl->next;
diff -r a2613fc1bce5 -r 862f6130d357 src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c	Fri Oct 29 20:21:51 2021 +0300
+++ b/src/http/ngx_http_upstream.c	Fri Oct 29 20:21:54 2021 +0300
@@ -1511,8 +1511,9 @@ ngx_http_upstream_check_broken_connectio
 static void
 ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
 {
-    ngx_int_t          rc;
-    ngx_connection_t  *c;
+    ngx_int_t                  rc;
+    ngx_connection_t          *c;
+    ngx_http_core_loc_conf_t  *clcf;
 
     r->connection->log->action = "connecting to upstream";
 
@@ -1599,10 +1600,12 @@ ngx_http_upstream_connect(ngx_http_reque
 
     /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */
 
+    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+
     u->writer.out = NULL;
     u->writer.last = &u->writer.out;
     u->writer.connection = c;
-    u->writer.limit = 0;
+    u->writer.limit = clcf->sendfile_max_chunk;
 
     if (u->request_sent) {
         if (ngx_http_upstream_reinit(r, u) != NGX_OK) {


More information about the nginx-devel mailing list