aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/http/ngx_http_file_cache.c67
1 files changed, 26 insertions, 41 deletions
diff --git a/src/http/ngx_http_file_cache.c b/src/http/ngx_http_file_cache.c
index 6d39269e3..2ad37ce47 100644
--- a/src/http/ngx_http_file_cache.c
+++ b/src/http/ngx_http_file_cache.c
@@ -1033,15 +1033,6 @@ ngx_http_file_cache_forced_expire(ngx_http_file_cache_t *cache)
break;
}
- if (!fcn->exists) {
-
- ngx_queue_remove(q);
- ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);
- ngx_slab_free_locked(cache->shpool, fcn);
-
- break;
- }
-
ngx_http_file_cache_delete(cache, q, name);
break;
@@ -1131,15 +1122,6 @@ ngx_http_file_cache_expire(ngx_http_file_cache_t *cache)
continue;
}
- if (!fcn->exists) {
-
- ngx_queue_remove(q);
- ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);
- ngx_slab_free_locked(cache->shpool, fcn);
-
- continue;
- }
-
ngx_http_file_cache_delete(cache, q, name);
}
@@ -1162,37 +1144,40 @@ ngx_http_file_cache_delete(ngx_http_file_cache_t *cache, ngx_queue_t *q,
fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);
- cache->sh->size -= (fcn->length + cache->bsize - 1) / cache->bsize;
-
- path = cache->path;
+ if (fcn->exists) {
+ cache->sh->size -= (fcn->length + cache->bsize - 1) / cache->bsize;
- p = name + path->name.len + 1 + path->len;
+ path = cache->path;
+ p = name + path->name.len + 1 + path->len;
+ p = ngx_hex_dump(p, (u_char *) &fcn->node.key,
+ sizeof(ngx_rbtree_key_t));
+ len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);
+ p = ngx_hex_dump(p, fcn->key, len);
+ *p = '\0';
- p = ngx_hex_dump(p, (u_char *) &fcn->node.key, sizeof(ngx_rbtree_key_t));
-
- len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);
- p = ngx_hex_dump(p, fcn->key, len);
- *p = '\0';
-
- ngx_queue_remove(q);
- ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);
- ngx_slab_free_locked(cache->shpool, fcn);
-
- ngx_shmtx_unlock(&cache->shpool->mutex);
+ fcn->count++;
+ ngx_shmtx_unlock(&cache->shpool->mutex);
- len = path->name.len + 1 + path->len + 2 * NGX_HTTP_CACHE_KEY_LEN;
+ len = path->name.len + 1 + path->len + 2 * NGX_HTTP_CACHE_KEY_LEN;
+ ngx_create_hashed_filename(path, name, len);
- ngx_create_hashed_filename(path, name, len);
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
+ "http file cache expire: \"%s\"", name);
- ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
- "http file cache expire: \"%s\"", name);
+ if (ngx_delete_file(name) == NGX_FILE_ERROR) {
+ ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno,
+ ngx_delete_file_n " \"%s\" failed", name);
+ }
- if (ngx_delete_file(name) == NGX_FILE_ERROR) {
- ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno,
- ngx_delete_file_n " \"%s\" failed", name);
+ ngx_shmtx_lock(&cache->shpool->mutex);
+ fcn->count--;
}
- ngx_shmtx_lock(&cache->shpool->mutex);
+ if (fcn->count == 0) {
+ ngx_queue_remove(q);
+ ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);
+ ngx_slab_free_locked(cache->shpool, fcn);
+ }
}