aboutsummaryrefslogtreecommitdiff
path: root/src/http/ngx_http_file_cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/ngx_http_file_cache.c')
-rw-r--r--src/http/ngx_http_file_cache.c89
1 files changed, 37 insertions, 52 deletions
diff --git a/src/http/ngx_http_file_cache.c b/src/http/ngx_http_file_cache.c
index 18794d8d0..23e3503e0 100644
--- a/src/http/ngx_http_file_cache.c
+++ b/src/http/ngx_http_file_cache.c
@@ -44,7 +44,6 @@ ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data)
ngx_http_file_cache_t *ocache = data;
size_t len;
- ngx_rbtree_node_t *sentinel;
ngx_http_file_cache_t *cache;
cache = shm_zone->data;
@@ -60,11 +59,9 @@ ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data)
return NGX_ERROR;
}
- cache->rbtree = ocache->rbtree;
- cache->queue = ocache->queue;
+ cache->sh = ocache->sh;
+
cache->shpool = ocache->shpool;
- cache->cold = ocache->cold;
- cache->size = ocache->size;
cache->bsize = ocache->bsize;
cache->max_size /= cache->bsize;
@@ -74,39 +71,27 @@ ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data)
cache->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
- cache->rbtree = ngx_slab_alloc(cache->shpool, sizeof(ngx_rbtree_t));
- if (cache->rbtree == NULL) {
- return NGX_ERROR;
- }
+ if (shm_zone->shm.exists) {
+ cache->sh = cache->shpool->data;
+ cache->bsize = ngx_fs_bsize(cache->path->name.data);
- sentinel = ngx_slab_alloc(cache->shpool, sizeof(ngx_rbtree_node_t));
- if (sentinel == NULL) {
- return NGX_ERROR;
+ return NGX_OK;
}
- ngx_rbtree_init(cache->rbtree, sentinel,
- ngx_http_file_cache_rbtree_insert_value);
-
- cache->queue = ngx_slab_alloc(cache->shpool, sizeof(ngx_queue_t));
- if (cache->queue == NULL) {
+ cache->sh = ngx_slab_alloc(cache->shpool, sizeof(ngx_http_file_cache_sh_t));
+ if (cache->sh == NULL) {
return NGX_ERROR;
}
- ngx_queue_init(cache->queue);
+ cache->shpool->data = cache->sh;
- cache->cold = ngx_slab_alloc(cache->shpool, sizeof(ngx_atomic_t));
- if (cache->cold == NULL) {
- return NGX_ERROR;
- }
-
- *cache->cold = 1;
+ ngx_rbtree_init(&cache->sh->rbtree, &cache->sh->sentinel,
+ ngx_http_file_cache_rbtree_insert_value);
- cache->size = ngx_slab_alloc(cache->shpool, sizeof(off_t));
- if (cache->size == NULL) {
- return NGX_ERROR;
- }
+ ngx_queue_init(&cache->sh->queue);
- *cache->size = 0;
+ cache->sh->cold = 1;
+ cache->sh->size = 0;
cache->bsize = ngx_fs_bsize(cache->path->name.data);
@@ -202,7 +187,7 @@ ngx_http_file_cache_open(ngx_http_request_t *r)
return rc;
}
- cold = *cache->cold;
+ cold = cache->sh->cold;
if (rc == NGX_OK) {
@@ -337,7 +322,7 @@ ngx_http_file_cache_open(ngx_http_request_t *r)
c->node->body_start = c->body_start;
c->node->exists = 1;
- *cache->size += (c->length + cache->bsize - 1) / cache->bsize;
+ cache->sh->size += (c->length + cache->bsize - 1) / cache->bsize;
}
ngx_shmtx_unlock(&cache->shpool->mutex);
@@ -434,7 +419,7 @@ ngx_http_file_cache_exists(ngx_http_file_cache_t *cache, ngx_http_cache_t *c)
ngx_memcpy(fcn->key, &c->key[sizeof(ngx_rbtree_key_t)],
NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t));
- ngx_rbtree_insert(cache->rbtree, &fcn->node);
+ ngx_rbtree_insert(&cache->sh->rbtree, &fcn->node);
renew:
@@ -454,7 +439,7 @@ done:
fcn->expire = ngx_time() + cache->inactive;
- ngx_queue_insert_head(cache->queue, &fcn->queue);
+ ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);
c->uniq = fcn->uniq;
c->uses = fcn->uses;
@@ -479,8 +464,8 @@ ngx_http_file_cache_lookup(ngx_http_file_cache_t *cache, u_char *key)
ngx_memcpy((u_char *) &node_key, key, sizeof(ngx_rbtree_key_t));
- node = cache->rbtree->root;
- sentinel = cache->rbtree->sentinel;
+ node = cache->sh->rbtree.root;
+ sentinel = cache->sh->rbtree.sentinel;
while (node != sentinel) {
@@ -663,7 +648,7 @@ ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf)
c->node->length = c->length;
- *cache->size += size;
+ cache->sh->size += size;
if (rc == NGX_OK) {
c->node->exists = 1;
@@ -828,8 +813,8 @@ ngx_http_file_cache_forced_expire(ngx_http_file_cache_t *cache)
ngx_shmtx_lock(&cache->shpool->mutex);
- for (q = ngx_queue_last(cache->queue);
- q != ngx_queue_sentinel(cache->queue);
+ for (q = ngx_queue_last(&cache->sh->queue);
+ q != ngx_queue_sentinel(&cache->sh->queue);
q = ngx_queue_prev(q))
{
fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);
@@ -853,7 +838,7 @@ ngx_http_file_cache_forced_expire(ngx_http_file_cache_t *cache)
if (!fcn->exists) {
ngx_queue_remove(q);
- ngx_rbtree_delete(cache->rbtree, &fcn->node);
+ ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);
ngx_slab_free_locked(cache->shpool, fcn);
break;
@@ -902,12 +887,12 @@ ngx_http_file_cache_expire(ngx_http_file_cache_t *cache)
for ( ;; ) {
- if (ngx_queue_empty(cache->queue)) {
+ if (ngx_queue_empty(&cache->sh->queue)) {
wait = 10;
break;
}
- q = ngx_queue_last(cache->queue);
+ q = ngx_queue_last(&cache->sh->queue);
fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);
@@ -939,7 +924,7 @@ ngx_http_file_cache_expire(ngx_http_file_cache_t *cache)
*/
ngx_queue_remove(q);
- ngx_rbtree_delete(cache->rbtree, &fcn->node);
+ ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);
ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
"ignore long locked inactive cache entry %*s, count:%d",
@@ -951,7 +936,7 @@ ngx_http_file_cache_expire(ngx_http_file_cache_t *cache)
if (!fcn->exists) {
ngx_queue_remove(q);
- ngx_rbtree_delete(cache->rbtree, &fcn->node);
+ ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);
ngx_slab_free_locked(cache->shpool, fcn);
continue;
@@ -979,7 +964,7 @@ 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->size -= (fcn->length + cache->bsize - 1) / cache->bsize;
+ cache->sh->size -= (fcn->length + cache->bsize - 1) / cache->bsize;
path = cache->path;
@@ -993,7 +978,7 @@ ngx_http_file_cache_delete(ngx_http_file_cache_t *cache, ngx_queue_t *q,
ngx_queue_remove(q);
- ngx_rbtree_delete(cache->rbtree, &fcn->node);
+ ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);
ngx_slab_free_locked(cache->shpool, fcn);
@@ -1024,7 +1009,7 @@ ngx_http_file_cache_manager(void *data)
time_t next;
ngx_tree_ctx_t tree;
- if (*cache->cold) {
+ if (cache->sh->cold) {
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
"http file cache manager update");
@@ -1045,12 +1030,12 @@ ngx_http_file_cache_manager(void *data)
return 10;
}
- *cache->cold = 0;
+ cache->sh->cold = 0;
ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,
"http file cache: %V %.3fM, bsize: %uz",
&cache->path->name,
- ((double) *cache->size * cache->bsize) / (1024 * 1024),
+ ((double) cache->sh->size * cache->bsize) / (1024 * 1024),
cache->bsize);
}
@@ -1062,7 +1047,7 @@ ngx_http_file_cache_manager(void *data)
for ( ;; ) {
ngx_shmtx_lock(&cache->shpool->mutex);
- size = *cache->size;
+ size = cache->sh->size;
ngx_shmtx_unlock(&cache->shpool->mutex);
@@ -1245,7 +1230,7 @@ ngx_http_file_cache_add(ngx_http_file_cache_t *cache, ngx_http_cache_t *c)
ngx_memcpy(fcn->key, &c->key[sizeof(ngx_rbtree_key_t)],
NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t));
- ngx_rbtree_insert(cache->rbtree, &fcn->node);
+ ngx_rbtree_insert(&cache->sh->rbtree, &fcn->node);
fcn->uses = 1;
fcn->count = 0;
@@ -1257,7 +1242,7 @@ ngx_http_file_cache_add(ngx_http_file_cache_t *cache, ngx_http_cache_t *c)
fcn->body_start = c->body_start;
fcn->length = c->length;
- *cache->size += (c->length + cache->bsize - 1) / cache->bsize;
+ cache->sh->size += (c->length + cache->bsize - 1) / cache->bsize;
} else {
ngx_queue_remove(&fcn->queue);
@@ -1265,7 +1250,7 @@ ngx_http_file_cache_add(ngx_http_file_cache_t *cache, ngx_http_cache_t *c)
fcn->expire = ngx_time() + cache->inactive;
- ngx_queue_insert_head(cache->queue, &fcn->queue);
+ ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);
ngx_shmtx_unlock(&cache->shpool->mutex);