# HG changeset patch # User Igor Sysoev # Date 1279199331 0 # Node ID dfb17155eca9310367f759eef6c2be34aa470aed # Parent e3bcc2f4c418f8cdae152e515e45d8e6bc1839f0 delete empty cache zone node if we could not get response to cache diff --git a/src/http/ngx_http_file_cache.c b/src/http/ngx_http_file_cache.c --- a/src/http/ngx_http_file_cache.c +++ b/src/http/ngx_http_file_cache.c @@ -835,8 +835,9 @@ ngx_http_cache_send(ngx_http_request_t * void ngx_http_file_cache_free(ngx_http_request_t *r, ngx_temp_file_t *tf) { - ngx_http_cache_t *c; - ngx_http_file_cache_t *cache; + ngx_http_cache_t *c; + ngx_http_file_cache_t *cache; + ngx_http_file_cache_node_t *fcn; c = r->cache; @@ -853,16 +854,22 @@ ngx_http_file_cache_free(ngx_http_reques ngx_shmtx_lock(&cache->shpool->mutex); - c->node->count--; + fcn = c->node; + fcn->count--; + fcn->updating = 0; if (c->error) { - c->node->valid_sec = c->valid_sec; - c->node->valid_msec = c->valid_msec; - c->node->error = c->error; + fcn->valid_sec = c->valid_sec; + fcn->valid_msec = c->valid_msec; + fcn->error = c->error; + + } else if (fcn->valid_msec == 0 && fcn->count == 0) { + ngx_queue_remove(&fcn->queue); + ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node); + ngx_slab_free_locked(cache->shpool, fcn); + c->node = NULL; } - c->node->updating = 0; - ngx_shmtx_unlock(&cache->shpool->mutex); if (c->temp_file) {