aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2022-02-01 16:29:28 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2022-02-01 16:29:28 +0300
commit17c24244b454365b2c068081fa0637ec063cf59c (patch)
tree5d852421041b3ccc512d80a96825fe07b5978317
parent05577c18a895d701cb00eef44d758ebf1bd00ddf (diff)
downloadnginx-17c24244b454365b2c068081fa0637ec063cf59c.tar.gz
nginx-17c24244b454365b2c068081fa0637ec063cf59c.zip
Cache: fixed race in ngx_http_file_cache_forced_expire().
During configuration reload two cache managers might exist for a short time. If both tried to delete the same cache node, the "ignore long locked inactive cache entry" alert appeared in logs. Additionally, ngx_http_file_cache_forced_expire() might be also called by worker processes, with similar results. Fix is to ignore cache nodes being deleted, similarly to how it is done in ngx_http_file_cache_expire() since 3755:76e3a93821b1. This was somehow missed in 7002:ab199f0eb8e8, when ignoring long locked cache entries was introduced in ngx_http_file_cache_forced_expire().
-rw-r--r--src/http/ngx_http_file_cache.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/http/ngx_http_file_cache.c b/src/http/ngx_http_file_cache.c
index c40093bca..4d2f6c42c 100644
--- a/src/http/ngx_http_file_cache.c
+++ b/src/http/ngx_http_file_cache.c
@@ -1756,6 +1756,11 @@ ngx_http_file_cache_forced_expire(ngx_http_file_cache_t *cache)
break;
}
+ if (fcn->deleting) {
+ wait = 1;
+ break;
+ }
+
p = ngx_hex_dump(key, (u_char *) &fcn->node.key,
sizeof(ngx_rbtree_key_t));
len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);