aboutsummaryrefslogtreecommitdiff
path: root/src/http/ngx_http_file_cache.c
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2015-02-02 19:38:35 +0300
committerRoman Arutyunyan <arut@nginx.com>2015-02-02 19:38:35 +0300
commitf8fecbc94d204c4ce1a86556d2642af00146995e (patch)
treea8e9046ec9b0f81790e58568523e5006ad9d65d8 /src/http/ngx_http_file_cache.c
parent54e14a387fe0b18dc3e607effef26603a32cacf5 (diff)
downloadnginx-f8fecbc94d204c4ce1a86556d2642af00146995e.tar.gz
nginx-f8fecbc94d204c4ce1a86556d2642af00146995e.zip
Cache: added temp_path to file cache.
If use_temp_path is set to off, a subdirectory "temp" is created in the cache directory. It's used instead of proxy_temp_path and friends for caching upstream response.
Diffstat (limited to 'src/http/ngx_http_file_cache.c')
-rw-r--r--src/http/ngx_http_file_cache.c62
1 files changed, 48 insertions, 14 deletions
diff --git a/src/http/ngx_http_file_cache.c b/src/http/ngx_http_file_cache.c
index ea3167369..00d4c0f5a 100644
--- a/src/http/ngx_http_file_cache.c
+++ b/src/http/ngx_http_file_cache.c
@@ -49,6 +49,8 @@ static ngx_int_t ngx_http_file_cache_noop(ngx_tree_ctx_t *ctx,
ngx_str_t *path);
static ngx_int_t ngx_http_file_cache_manage_file(ngx_tree_ctx_t *ctx,
ngx_str_t *path);
+static ngx_int_t ngx_http_file_cache_manage_directory(ngx_tree_ctx_t *ctx,
+ ngx_str_t *path);
static ngx_int_t ngx_http_file_cache_add_file(ngx_tree_ctx_t *ctx,
ngx_str_t *path);
static ngx_int_t ngx_http_file_cache_add(ngx_http_file_cache_t *cache,
@@ -1845,7 +1847,7 @@ ngx_http_file_cache_loader(void *data)
tree.init_handler = NULL;
tree.file_handler = ngx_http_file_cache_manage_file;
- tree.pre_tree_handler = ngx_http_file_cache_noop;
+ tree.pre_tree_handler = ngx_http_file_cache_manage_directory;
tree.post_tree_handler = ngx_http_file_cache_noop;
tree.spec_handler = ngx_http_file_cache_delete_file;
tree.data = cache;
@@ -1910,6 +1912,19 @@ ngx_http_file_cache_manage_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)
}
+static ngx_int_t
+ngx_http_file_cache_manage_directory(ngx_tree_ctx_t *ctx, ngx_str_t *path)
+{
+ if (path->len >= 5
+ && ngx_strncmp(path->data + path->len - 5, "/temp", 5) == 0)
+ {
+ return NGX_DECLINED;
+ }
+
+ return NGX_OK;
+}
+
+
static void
ngx_http_file_cache_loader_sleep(ngx_http_file_cache_t *cache)
{
@@ -1935,17 +1950,6 @@ ngx_http_file_cache_add_file(ngx_tree_ctx_t *ctx, ngx_str_t *name)
return NGX_ERROR;
}
- /*
- * Temporary files in cache have a suffix consisting of a dot
- * followed by 10 digits.
- */
-
- if (name->len >= 2 * NGX_HTTP_CACHE_KEY_LEN + 1 + 10
- && name->data[name->len - 10 - 1] == '.')
- {
- return NGX_OK;
- }
-
if (ctx->size < (off_t) sizeof(ngx_http_file_cache_header_t)) {
ngx_log_error(NGX_LOG_CRIT, ctx->log, 0,
"cache file \"%s\" is too small", name->data);
@@ -2070,6 +2074,7 @@ ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
off_t max_size;
u_char *last, *p;
time_t inactive;
+ size_t len;
ssize_t size;
ngx_str_t s, name, *value;
ngx_int_t loader_files;
@@ -2291,6 +2296,37 @@ ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
return NGX_CONF_ERROR;
}
+ if (!use_temp_path) {
+ cache->temp_path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));
+ if (cache->temp_path == NULL) {
+ return NGX_CONF_ERROR;
+ }
+
+ len = cache->path->name.len + sizeof("/temp") - 1;
+
+ p = ngx_pnalloc(cf->pool, len + 1);
+ if (p == NULL) {
+ return NGX_CONF_ERROR;
+ }
+
+ cache->temp_path->name.len = len;
+ cache->temp_path->name.data = p;
+
+ p = ngx_cpymem(p, cache->path->name.data, cache->path->name.len);
+ ngx_memcpy(p, "/temp", sizeof("/temp"));
+
+ ngx_memcpy(&cache->temp_path->level, &cache->path->level,
+ 3 * sizeof(size_t));
+
+ cache->temp_path->len = cache->path->len;
+ cache->temp_path->conf_file = cf->conf_file->file.name.data;
+ cache->temp_path->line = cf->conf_file->line;
+
+ if (ngx_add_path(cf, &cache->temp_path) != NGX_OK) {
+ return NGX_CONF_ERROR;
+ }
+ }
+
cache->shm_zone = ngx_shared_memory_add(cf, &name, size, cmd->post);
if (cache->shm_zone == NULL) {
return NGX_CONF_ERROR;
@@ -2306,8 +2342,6 @@ ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
cache->shm_zone->init = ngx_http_file_cache_init;
cache->shm_zone->data = cache;
- cache->use_temp_path = use_temp_path;
-
cache->inactive = inactive;
cache->max_size = max_size;