[nginx] Cache: keep c->body_start when Vary changes (ticket #2029).
Sergey Kandaurov
pluknet at nginx.com
Fri Sep 11 19:16:46 UTC 2020
details: https://hg.nginx.org/nginx/rev/3781de64e747
branches:
changeset: 7705:3781de64e747
user: Sergey Kandaurov <pluknet at nginx.com>
date: Wed Sep 09 19:26:27 2020 +0300
description:
Cache: keep c->body_start when Vary changes (ticket #2029).
If the variant hash doesn't match one we used as a secondary cache key,
we switch back to the original key. In this case, c->body_start was kept
updated from an existing cache node overwriting the new response value.
After file cache update, it led to discrepancy between a cache node and
cache file seen as critical errors "file cache .. has too long header".
diffstat:
src/http/ngx_http_cache.h | 1 +
src/http/ngx_http_file_cache.c | 3 ++-
2 files changed, 3 insertions(+), 1 deletions(-)
diffs (31 lines):
diff -r 847fd35f94de -r 3781de64e747 src/http/ngx_http_cache.h
--- a/src/http/ngx_http_cache.h Fri Aug 04 19:37:37 2017 +0300
+++ b/src/http/ngx_http_cache.h Wed Sep 09 19:26:27 2020 +0300
@@ -117,6 +117,7 @@ struct ngx_http_cache_s {
unsigned purged:1;
unsigned reading:1;
unsigned secondary:1;
+ unsigned update_variant:1;
unsigned background:1;
unsigned stale_updating:1;
diff -r 847fd35f94de -r 3781de64e747 src/http/ngx_http_file_cache.c
--- a/src/http/ngx_http_file_cache.c Fri Aug 04 19:37:37 2017 +0300
+++ b/src/http/ngx_http_file_cache.c Wed Sep 09 19:26:27 2020 +0300
@@ -854,7 +854,7 @@ ngx_http_file_cache_exists(ngx_http_file
if (fcn->exists || fcn->uses >= c->min_uses) {
c->exists = fcn->exists;
- if (fcn->body_start) {
+ if (fcn->body_start && !c->update_variant) {
c->body_start = fcn->body_start;
}
@@ -1339,6 +1339,7 @@ ngx_http_file_cache_update_variant(ngx_h
ngx_shmtx_unlock(&cache->shpool->mutex);
c->file.name.len = 0;
+ c->update_variant = 1;
ngx_memcpy(c->key, c->main, NGX_HTTP_CACHE_KEY_LEN);
More information about the nginx-devel
mailing list