mirror of
https://github.com/nginx/nginx.git
synced 2025-07-25 22:56:59 +08:00
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".
This commit is contained in:
parent
ed0b19cdd4
commit
dc1b14126e
@ -117,6 +117,7 @@ struct ngx_http_cache_s {
|
|||||||
unsigned purged:1;
|
unsigned purged:1;
|
||||||
unsigned reading:1;
|
unsigned reading:1;
|
||||||
unsigned secondary:1;
|
unsigned secondary:1;
|
||||||
|
unsigned update_variant:1;
|
||||||
unsigned background:1;
|
unsigned background:1;
|
||||||
|
|
||||||
unsigned stale_updating:1;
|
unsigned stale_updating:1;
|
||||||
|
@ -854,7 +854,7 @@ ngx_http_file_cache_exists(ngx_http_file_cache_t *cache, ngx_http_cache_t *c)
|
|||||||
if (fcn->exists || fcn->uses >= c->min_uses) {
|
if (fcn->exists || fcn->uses >= c->min_uses) {
|
||||||
|
|
||||||
c->exists = fcn->exists;
|
c->exists = fcn->exists;
|
||||||
if (fcn->body_start) {
|
if (fcn->body_start && !c->update_variant) {
|
||||||
c->body_start = fcn->body_start;
|
c->body_start = fcn->body_start;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1339,6 +1339,7 @@ ngx_http_file_cache_update_variant(ngx_http_request_t *r, ngx_http_cache_t *c)
|
|||||||
ngx_shmtx_unlock(&cache->shpool->mutex);
|
ngx_shmtx_unlock(&cache->shpool->mutex);
|
||||||
|
|
||||||
c->file.name.len = 0;
|
c->file.name.len = 0;
|
||||||
|
c->update_variant = 1;
|
||||||
|
|
||||||
ngx_memcpy(c->key, c->main, NGX_HTTP_CACHE_KEY_LEN);
|
ngx_memcpy(c->key, c->main, NGX_HTTP_CACHE_KEY_LEN);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user