<div dir="ltr"># HG changeset patch<br># User Sangdeuk Kwon <<a href="mailto:sangdeuk.kwon@quantil.com">sangdeuk.kwon@quantil.com</a>><br># Date 1585118845 -32400<br>#      Wed Mar 25 15:47:25 2020 +0900<br># Node ID fe5988cefe615bb0f2a8936221c8464a6664916e<br># Parent  0cb942c1c1aa98118076e72e0b89940e85e6291c<br>When cache file is expired, nginx can make a lot of upstream requests.<br><br>In cache miss case, nginx makes only one upstream request<br>if "proxy_cache_lock" is "on".<br>When cache file is expired, nginx can make a lot of upstream requests<br>even though "proxy_cache_lock" is "on".<br><br>If origin's content is changed, this simultaneous upstream requests<br>can make "too long header" error log.<br><br>diff -r 0cb942c1c1aa -r fe5988cefe61 src/http/ngx_http_cache.h<br>--- a/src/http/ngx_http_cache.h Fri Mar 13 02:12:10 2020 +0300<br>+++ b/src/http/ngx_http_cache.h Wed Mar 25 15:47:25 2020 +0900<br>@@ -188,6 +188,7 @@<br> ngx_int_t ngx_http_file_cache_create(ngx_http_request_t *r);<br> void ngx_http_file_cache_create_key(ngx_http_request_t *r);<br> ngx_int_t ngx_http_file_cache_open(ngx_http_request_t *r);<br>+ngx_int_t ngx_http_file_cache_handle_updating(ngx_http_request_t *r);<br> ngx_int_t ngx_http_file_cache_set_header(ngx_http_request_t *r, u_char *buf);<br> void ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf);<br> void ngx_http_file_cache_update_header(ngx_http_request_t *r);<br>diff -r 0cb942c1c1aa -r fe5988cefe61 src/http/ngx_http_file_cache.c<br>--- a/src/http/ngx_http_file_cache.c    Fri Mar 13 02:12:10 2020 +0300<br>+++ b/src/http/ngx_http_file_cache.c    Wed Mar 25 15:47:25 2020 +0900<br>@@ -522,6 +522,28 @@<br> }<br><br><br><div>+ngx_int_t<br>+ngx_http_file_cache_handle_updating(ngx_http_request_t *r)<br>+{<br>+    ngx_http_cache_t          *c;<br>+    ngx_http_file_cache_t     *cache;<br>+    ngx_int_t                  updating;<br>+<br>+    c = r->cache;<br>+    cache = c->file_cache;<br>+<br>+    ngx_shmtx_lock(&cache->shpool->mutex);<br>+    updating = c->node->updating;<br>+    ngx_shmtx_unlock(&cache->shpool->mutex);<br>+<br>+    if (!updating) {<br>+        return NGX_OK;<br>+    }<br>+<br>+    return ngx_http_file_cache_lock(r, c);<br>+}<br>+<br>+<br> static ngx_int_t<br> ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c)<br> {<br>diff -r 0cb942c1c1aa -r fe5988cefe61 src/http/ngx_http_upstream.c<br>--- a/src/http/ngx_http_upstream.c  Fri Mar 13 02:12:10 2020 +0300<br>+++ b/src/http/ngx_http_upstream.c  Wed Mar 25 15:47:25 2020 +0900<br>@@ -906,6 +906,10 @@<br>             } else {<br>                 rc = NGX_ERROR;<br>             }<br>+        } else {<br>+            if (ngx_http_file_cache_handle_updating(r) == NGX_AGAIN) {<br>+                rc = NGX_BUSY;<br>+            }<br>         }<br><br>         break;<br>@@ -919,7 +923,11 @@<br>             rc = NGX_OK;<br><br>         } else {<br>-            rc = NGX_HTTP_CACHE_STALE;<br>+            if (ngx_http_file_cache_handle_updating(r) == NGX_AGAIN) {<br>+                rc = NGX_BUSY;<br>+            } else {<br>+                rc = NGX_HTTP_CACHE_STALE;<br>+            }<br>         }<br><br>         break;<br></div></div>