Possible error on revalidate in ngx_http_upstream

Jiří Setnička jiri.setnicka at cdn77.com
Thu Oct 7 16:37:11 UTC 2021


I use nginx as a proxy with enabled cache. I encountered strange 
behavior on revalidate.

When upstream does not return any caching headers it is ok - file is 
cached with default cachetime and on revalidate the r->cache->valid_sec 
is updated to now + default cachetime.

Also when upstream consistently returns caching headers it is still ok - 
file is cached according to caching headers and on revalidate the 
r->cache->valid_sec is updated by value from 304 response caching headers.

Problem is when upstream previously returned absolute caching headers on 
200 response (so the file is cached according to these headers and these 
headers are saved into cache file on disk) but later it changed its 
behavior and on 304 response it does not return any caching headers.
In such case, I would expect that now + default cachetime would be used 
as the new r->cache->valid_sec, but old absolute time is used instead 
and this yields in revalidate on each request.

In ngx_http_upstream_test_next(...) in revalidate part there is firstly 
cache time from upstream 304 response saved to temporal variable (valid 
= r->cache->valid_sec) and then request is reinited and 
r->cache->valid_sec is set according to headers in the cached file.
Problem is when value == 0 (no caching info from upstream) and there is 
an absolute time in the cached file headers.

This patch should fix this behavior - time computed from cached file is 
used only when it is in the future otherwise, time calculated by 
ngx_http_file_cache_valid(...) is used.

Thanks for your feedback
Jiri Setnicka

# HG changeset patch
# User Jiří Setnička <jiri.setnicka at cdn77.com>
# Date 1633624103 -7200
#      Thu Oct 07 18:28:23 2021 +0200
# Node ID 7149a1553b48a7403a8b8cea09580b103aab23b1
# Parent  ae7c767aa491fa55d3168dfc028a22f43ac8cf89
Do not use cache->valid_sec in the past from cached file when revalidating

diff -r ae7c767aa491 -r 7149a1553b48 src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c      Wed Oct 06 18:01:42 2021 +0300
+++ b/src/http/ngx_http_upstream.c      Thu Oct 07 18:28:23 2021 +0200
@@ -2606,7 +2606,7 @@

-        if (valid == 0) {
+        if (valid == 0 && r->cache->valid_sec >= now) {
              valid = r->cache->valid_sec;
              updating = r->cache->updating_sec;
              error = r->cache->error_sec;

More information about the nginx-devel mailing list