Mercurial > hg > nginx
changeset 7705:3781de64e747
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".
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Wed, 09 Sep 2020 19:26:27 +0300 |
parents | 847fd35f94de |
children | 61011bfcdb49 |
files | src/http/ngx_http_cache.h src/http/ngx_http_file_cache.c |
diffstat | 2 files changed, 3 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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 @@ unsigned purged:1; unsigned reading:1; unsigned secondary:1; + unsigned update_variant:1; unsigned background:1; unsigned stale_updating:1;
--- 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 @@ 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_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);