<div dir="ltr"># HG changeset patch<br># User Sangdeuk Kwon <<a href="mailto:sangdeuk.kwon@quantil.com">sangdeuk.kwon@quantil.com</a>><br># Date 1670906112 -32400<br>#      Tue Dec 13 13:35:12 2022 +0900<br># Node ID 8c273203bd8e7280d3ce1895a37c7ef5323eea2b<br># Parent  56819a9491fe2ee1dcfe4986bed913b894fc0360<br>proxy_cache_max_range_offset could affect the background updating<br><br>proxy_cache_max_range_offset doesn't care about the upstream of background updating.<br>So, nginx drops the new cache file after background updating.<br>This behavior is strange because background updating is just to fetch<br>new content after serving a stale cache, not to serve it.<br><br>I think the background updating should be not affected by proxy_cache_max_range_offset.<br><br>Related directives:<br>proxy_cache_max_range_offset 10;<br>proxy_cache_use_stale updating;<br>proxy_cache_background_update on;<br><br>diff -r 56819a9491fe -r 8c273203bd8e src/http/ngx_http_upstream.c<br>--- a/src/http/ngx_http_upstream.c      Thu Dec 01 04:22:36 2022 +0300<br>+++ b/src/http/ngx_http_upstream.c      Tue Dec 13 13:35:12 2022 +0900<br>@@ -1143,7 +1143,8 @@<br> <br>     if (h == NULL<br>         || !u->cacheable<br>-        || u->conf->cache_max_range_offset == NGX_MAX_OFF_T_VALUE)<br>+        || u->conf->cache_max_range_offset == NGX_MAX_OFF_T_VALUE<br>+        || r->background)<br>     {<br>         return NGX_OK;<br>     }<br><div><br></div><div><br></div><div><br></div><div>I moved the condition into ngx_http_upstream_cache_check_range() function.</div><div><br></div><div><br></div><div>>> On 7 Dec 2022, at 09:26, Sangdeuk Kwon <<a href="mailto:sangdeuk.kwon@quantil.com" target="_blank">sangdeuk.kwon@quantil.com</a>> wrote:<br>>><br>>> # HG changeset patch<br>>> # User Sangdeuk Kwon <<a href="mailto:sangdeuk.kwon@quantil.com" target="_blank">sangdeuk.kwon@quantil.com</a>><br>>> # Date 1670390583 -32400<br>>> #      Wed Dec 07 14:23:03 2022 +0900<br>>> # Node ID a1069fbf10ffd806b7c8d6deb3f6546edc7b0427<br>>> # Parent  0b360747c74e3fa7e439e0684a8cf1da2d14d8f6<br>>> proxy_cache_max_range_offset could affect the background updating<br>>><br>>> proxy_cache_max_range_offset doesn't care about the upstream of background updating.<br>>> So, nginx drops the new cache file after background updating.<br>>> This behavior is strange because background updating is just to fetch<br>>> new content after serving a stale cache, not to serve it.<br>>><br>>> I think the background updating should be not affected by proxy_cache_max_range_offset.<br>>><br>><br>> Indeed, such configuration with far ranges results in useless background<br>> (range) subrequests, the response is discarded.<br>><br>> While the behaviour matches the description of proxy_cache_max_range_offset,<br>> I believe the original intention was to avoid latencies in sending output<br>> to the client, imposed by obtaining a new full resource from upstream.<br>> As long as background subrequests don't delay sending output to the client,<br>> it should be ok to keep caching of (full) response enabled, regardless of<br>> whether the proxy_cache_max_range_offset limit is hit.<br>><br>>> Related directives:<br>>> proxy_cache_max_range_offset 10;<br>>> proxy_cache_use_stale updating;<br>>> proxy_cache_background_update on;<br>>><br>>> diff -r 0b360747c74e -r a1069fbf10ff src/http/ngx_http_upstream.c<br>>> --- a/src/http/ngx_http_upstream.c      Thu Nov 24 23:08:30 2022 +0400<br>>> +++ b/src/http/ngx_http_upstream.c      Wed Dec 07 14:23:03 2022 +0900<br>>> @@ -986,7 +986,9 @@<br>>>          return rc;<br>>>      }<br>>> <br>>> -    if (ngx_http_upstream_cache_check_range(r, u) == NGX_DECLINED) {<br>>> +    if (!r->background<br>>> +        && ngx_http_upstream_cache_check_range(r, u) == NGX_DECLINED)<br>>> +    {<br>>>          u->cacheable = 0;<br>>>      }<br>>> <br>><br>> Given the above, I cannot imagine that testing far ranges<br>> is anyhow usable for background subrequests in practice.<br>> As such, I think the condition can be moved inside of the<br>> ngx_http_upstream_cache_check_range() function.<br></div></div>