annotate src/http/ngx_http_file_cache.c @ 8124:f5515e727656

Fixed "zero size buf" alerts with subrequests. Since 4611:2b6cb7528409 responses from the gzip static, flv, and mp4 modules can be used with subrequests, though empty files were not properly handled. Empty gzipped, flv, and mp4 files thus resulted in "zero size buf in output" alerts. While valid corresponding files are not expected to be empty, such files shouldn't result in alerts. Fix is to set b->sync on such empty subrequest responses, similarly to what ngx_http_send_special() does. Additionally, the static module, the ngx_http_send_response() function, and file cache are modified to do the same instead of not sending the response body at all in such cases, since not sending the response body at all is believed to be at least questionable, and might break various filters which do not expect such behaviour.
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 28 Jan 2023 05:23:33 +0300
parents 1c3b78d7cdc9
children e88cdaa0f1ff
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 265
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 265
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4387
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 265
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 265
diff changeset
6
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
11 #include <ngx_md5.h>
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
14 static ngx_int_t ngx_http_file_cache_lock(ngx_http_request_t *r,
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
15 ngx_http_cache_t *c);
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
16 static void ngx_http_file_cache_lock_wait_handler(ngx_event_t *ev);
5928
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
17 static void ngx_http_file_cache_lock_wait(ngx_http_request_t *r,
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
18 ngx_http_cache_t *c);
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
19 static ngx_int_t ngx_http_file_cache_read(ngx_http_request_t *r,
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
20 ngx_http_cache_t *c);
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
21 static ssize_t ngx_http_file_cache_aio_read(ngx_http_request_t *r,
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
22 ngx_http_cache_t *c);
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
23 #if (NGX_HAVE_FILE_AIO)
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
24 static void ngx_http_cache_aio_event_handler(ngx_event_t *ev);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
25 #endif
6063
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
26 #if (NGX_THREADS)
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
27 static ngx_int_t ngx_http_cache_thread_handler(ngx_thread_task_t *task,
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
28 ngx_file_t *file);
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
29 static void ngx_http_cache_thread_event_handler(ngx_event_t *ev);
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
30 #endif
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
31 static ngx_int_t ngx_http_file_cache_exists(ngx_http_file_cache_t *cache,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
32 ngx_http_cache_t *c);
3696
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
33 static ngx_int_t ngx_http_file_cache_name(ngx_http_request_t *r,
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
34 ngx_path_t *path);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
35 static ngx_http_file_cache_node_t *
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
36 ngx_http_file_cache_lookup(ngx_http_file_cache_t *cache, u_char *key);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
37 static void ngx_http_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
38 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
5878
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
39 static void ngx_http_file_cache_vary(ngx_http_request_t *r, u_char *vary,
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
40 size_t len, u_char *hash);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
41 static void ngx_http_file_cache_vary_header(ngx_http_request_t *r,
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
42 ngx_md5_t *md5, ngx_str_t *name);
5880
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
43 static ngx_int_t ngx_http_file_cache_reopen(ngx_http_request_t *r,
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
44 ngx_http_cache_t *c);
5959
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
45 static ngx_int_t ngx_http_file_cache_update_variant(ngx_http_request_t *r,
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
46 ngx_http_cache_t *c);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
47 static void ngx_http_file_cache_cleanup(void *data);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
48 static time_t ngx_http_file_cache_forced_expire(ngx_http_file_cache_t *cache);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
49 static time_t ngx_http_file_cache_expire(ngx_http_file_cache_t *cache);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
50 static void ngx_http_file_cache_delete(ngx_http_file_cache_t *cache,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
51 ngx_queue_t *q, u_char *name);
4018
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
52 static void ngx_http_file_cache_loader_sleep(ngx_http_file_cache_t *cache);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
53 static ngx_int_t ngx_http_file_cache_noop(ngx_tree_ctx_t *ctx,
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
54 ngx_str_t *path);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
55 static ngx_int_t ngx_http_file_cache_manage_file(ngx_tree_ctx_t *ctx,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
56 ngx_str_t *path);
5968
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
57 static ngx_int_t ngx_http_file_cache_manage_directory(ngx_tree_ctx_t *ctx,
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
58 ngx_str_t *path);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
59 static ngx_int_t ngx_http_file_cache_add_file(ngx_tree_ctx_t *ctx,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
60 ngx_str_t *path);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
61 static ngx_int_t ngx_http_file_cache_add(ngx_http_file_cache_t *cache,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
62 ngx_http_cache_t *c);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
63 static ngx_int_t ngx_http_file_cache_delete_file(ngx_tree_ctx_t *ctx,
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
64 ngx_str_t *path);
6445
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
65 static void ngx_http_file_cache_set_watermark(ngx_http_file_cache_t *cache);
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
68 ngx_str_t ngx_http_cache_status[] = {
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
69 ngx_string("MISS"),
3699
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
70 ngx_string("BYPASS"),
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
71 ngx_string("EXPIRED"),
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
72 ngx_string("STALE"),
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
73 ngx_string("UPDATING"),
5441
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
74 ngx_string("REVALIDATED"),
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
75 ngx_string("HIT")
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
76 };
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
77
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
78
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
79 static u_char ngx_http_file_cache_key[] = { LF, 'K', 'E', 'Y', ':', ' ' };
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
82 static ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
83 ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data)
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
85 ngx_http_file_cache_t *ocache = data;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86
2611
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
87 size_t len;
3017
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
88 ngx_uint_t n;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
89 ngx_http_file_cache_t *cache;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
91 cache = shm_zone->data;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
93 if (ocache) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
94 if (ngx_strcmp(cache->path->name.data, ocache->path->name.data) != 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
95 ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
96 "cache \"%V\" uses the \"%V\" cache path "
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
97 "while previously it used the \"%V\" cache path",
2716
d5896f6608e8 move zone name from ngx_shm_zone_t to ngx_shm_t to use Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2694
diff changeset
98 &shm_zone->shm.name, &cache->path->name,
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
99 &ocache->path->name);
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 return NGX_ERROR;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103
6617
8bf484eef9ab Use NGX_MAX_PATH_LEVEL where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 6539
diff changeset
104 for (n = 0; n < NGX_MAX_PATH_LEVEL; n++) {
3017
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
105 if (cache->path->level[n] != ocache->path->level[n]) {
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
106 ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
107 "cache \"%V\" had previously different levels",
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
108 &shm_zone->shm.name);
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
109 return NGX_ERROR;
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
110 }
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
111 }
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
112
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
113 cache->sh = ocache->sh;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
114
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
115 cache->shpool = ocache->shpool;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
116 cache->bsize = ocache->bsize;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
117
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
118 cache->max_size /= cache->bsize;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
119
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
120 if (!cache->sh->cold || cache->sh->loading) {
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
121 cache->path->loader = NULL;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
122 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
123
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
124 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
125 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
126
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
127 cache->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
128
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
129 if (shm_zone->shm.exists) {
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
130 cache->sh = cache->shpool->data;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
131 cache->bsize = ngx_fs_bsize(cache->path->name.data);
7075
72d3aefc2993 Cache: fixed max_size on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 7002
diff changeset
132 cache->max_size /= cache->bsize;
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
133
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
134 return NGX_OK;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
135 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
136
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
137 cache->sh = ngx_slab_alloc(cache->shpool, sizeof(ngx_http_file_cache_sh_t));
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
138 if (cache->sh == NULL) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
139 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
140 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
141
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
142 cache->shpool->data = cache->sh;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
143
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
144 ngx_rbtree_init(&cache->sh->rbtree, &cache->sh->sentinel,
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
145 ngx_http_file_cache_rbtree_insert_value);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
146
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
147 ngx_queue_init(&cache->sh->queue);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
148
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
149 cache->sh->cold = 1;
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
150 cache->sh->loading = 0;
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
151 cache->sh->size = 0;
6445
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
152 cache->sh->count = 0;
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
153 cache->sh->watermark = (ngx_uint_t) -1;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
154
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
155 cache->bsize = ngx_fs_bsize(cache->path->name.data);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
156
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
157 cache->max_size /= cache->bsize;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
158
2716
d5896f6608e8 move zone name from ngx_shm_zone_t to ngx_shm_t to use Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2694
diff changeset
159 len = sizeof(" in cache keys zone \"\"") + shm_zone->shm.name.len;
2611
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
160
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
161 cache->shpool->log_ctx = ngx_slab_alloc(cache->shpool, len);
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
162 if (cache->shpool->log_ctx == NULL) {
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
163 return NGX_ERROR;
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
164 }
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
165
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
166 ngx_sprintf(cache->shpool->log_ctx, " in cache keys zone \"%V\"%Z",
2716
d5896f6608e8 move zone name from ngx_shm_zone_t to ngx_shm_t to use Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2694
diff changeset
167 &shm_zone->shm.name);
2611
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
168
5822
063f7e75f9ef Upstream: suppressed the file cache slab allocator error messages.
Roman Arutyunyan <arut@nginx.com>
parents: 5737
diff changeset
169 cache->shpool->log_nomem = 0;
063f7e75f9ef Upstream: suppressed the file cache slab allocator error messages.
Roman Arutyunyan <arut@nginx.com>
parents: 5737
diff changeset
170
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
171 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
172 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
173
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
174
3697
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
175 ngx_int_t
3698
d11227f0107f rename ngx_http_file_cache_create() to ngx_http_file_cache_new()
Igor Sysoev <igor@sysoev.ru>
parents: 3697
diff changeset
176 ngx_http_file_cache_new(ngx_http_request_t *r)
3697
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
177 {
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
178 ngx_http_cache_t *c;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
179
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
180 c = ngx_pcalloc(r->pool, sizeof(ngx_http_cache_t));
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
181 if (c == NULL) {
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
182 return NGX_ERROR;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
183 }
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
184
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
185 if (ngx_array_init(&c->keys, r->pool, 4, sizeof(ngx_str_t)) != NGX_OK) {
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
186 return NGX_ERROR;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
187 }
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
188
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
189 r->cache = c;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
190 c->file.log = r->connection->log;
3704
f220e5a5fb5e initialize r->cache->file.fd with NGX_INVALID_FILE
Igor Sysoev <igor@sysoev.ru>
parents: 3699
diff changeset
191 c->file.fd = NGX_INVALID_FILE;
3697
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
192
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
193 return NGX_OK;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
194 }
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
195
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
196
3699
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
197 ngx_int_t
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
198 ngx_http_file_cache_create(ngx_http_request_t *r)
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
199 {
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
200 ngx_http_cache_t *c;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
201 ngx_pool_cleanup_t *cln;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
202 ngx_http_file_cache_t *cache;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
203
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
204 c = r->cache;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
205 cache = c->file_cache;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
206
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
207 cln = ngx_pool_cleanup_add(r->pool, 0);
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
208 if (cln == NULL) {
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
209 return NGX_ERROR;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
210 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
211
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
212 cln->handler = ngx_http_file_cache_cleanup;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
213 cln->data = c;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
214
3699
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
215 if (ngx_http_file_cache_exists(cache, c) == NGX_ERROR) {
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
216 return NGX_ERROR;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
217 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
218
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
219 if (ngx_http_file_cache_name(r, cache->path) != NGX_OK) {
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
220 return NGX_ERROR;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
221 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
222
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
223 return NGX_OK;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
224 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
225
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
226
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
227 void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
228 ngx_http_file_cache_create_key(ngx_http_request_t *r)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
229 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
230 size_t len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
231 ngx_str_t *key;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
232 ngx_uint_t i;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
233 ngx_md5_t md5;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
234 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
235
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
236 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
237
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
238 len = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
239
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
240 ngx_crc32_init(c->crc32);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
241 ngx_md5_init(&md5);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
242
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
243 key = c->keys.elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
244 for (i = 0; i < c->keys.nelts; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
245 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
246 "http cache key: \"%V\"", &key[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
247
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
248 len += key[i].len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
249
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
250 ngx_crc32_update(&c->crc32, key[i].data, key[i].len);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
251 ngx_md5_update(&md5, key[i].data, key[i].len);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
252 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
253
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
254 c->header_start = sizeof(ngx_http_file_cache_header_t)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
255 + sizeof(ngx_http_file_cache_key) + len + 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
256
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
257 ngx_crc32_final(c->crc32);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
258 ngx_md5_final(c->key, &md5);
5880
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
259
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
260 ngx_memcpy(c->main, c->key, NGX_HTTP_CACHE_KEY_LEN);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
261 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
262
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
263
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
264 ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
265 ngx_http_file_cache_open(ngx_http_request_t *r)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
266 {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
267 ngx_int_t rc, rv;
5984
3f568dd68af1 Cache: reduced diffs to the plus version of nginx.
Ruslan Ermilov <ru@nginx.com>
parents: 5968
diff changeset
268 ngx_uint_t test;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
269 ngx_http_cache_t *c;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
270 ngx_pool_cleanup_t *cln;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
271 ngx_open_file_info_t of;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
272 ngx_http_file_cache_t *cache;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
273 ngx_http_core_loc_conf_t *clcf;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
274
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
275 c = r->cache;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
276
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
277 if (c->waiting) {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
278 return NGX_AGAIN;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
279 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
280
5879
c525c0454aa5 Cache: c->reading flag introduced.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5878
diff changeset
281 if (c->reading) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
282 return ngx_http_file_cache_read(r, c);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
283 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
284
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
285 cache = c->file_cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
286
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
287 if (c->node == NULL) {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
288 cln = ngx_pool_cleanup_add(r->pool, 0);
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
289 if (cln == NULL) {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
290 return NGX_ERROR;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
291 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
292
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
293 cln->handler = ngx_http_file_cache_cleanup;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
294 cln->data = c;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
295 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
296
7704
847fd35f94de Cache: reset c->body_start when reading a variant on Vary mismatch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7670
diff changeset
297 c->buffer_size = c->body_start;
847fd35f94de Cache: reset c->body_start when reading a variant on Vary mismatch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7670
diff changeset
298
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
299 rc = ngx_http_file_cache_exists(cache, c);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
300
2926
80a314b63c56 delete useless r->cache->uses
Igor Sysoev <igor@sysoev.ru>
parents: 2925
diff changeset
301 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
80a314b63c56 delete useless r->cache->uses
Igor Sysoev <igor@sysoev.ru>
parents: 2925
diff changeset
302 "http file cache exists: %i e:%d", rc, c->exists);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
303
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
304 if (rc == NGX_ERROR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
305 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
306 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
307
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
308 if (rc == NGX_AGAIN) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
309 return NGX_HTTP_CACHE_SCARCE;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
310 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
311
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
312 if (rc == NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
313
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
314 if (c->error) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
315 return c->error;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
316 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
317
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
318 c->temp_file = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
319 test = c->exists ? 1 : 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
320 rv = NGX_DECLINED;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
321
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
322 } else { /* rc == NGX_DECLINED */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
323
5984
3f568dd68af1 Cache: reduced diffs to the plus version of nginx.
Ruslan Ermilov <ru@nginx.com>
parents: 5968
diff changeset
324 test = cache->sh->cold ? 1 : 0;
3f568dd68af1 Cache: reduced diffs to the plus version of nginx.
Ruslan Ermilov <ru@nginx.com>
parents: 5968
diff changeset
325
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
326 if (c->min_uses > 1) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
327
5984
3f568dd68af1 Cache: reduced diffs to the plus version of nginx.
Ruslan Ermilov <ru@nginx.com>
parents: 5968
diff changeset
328 if (!test) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
329 return NGX_HTTP_CACHE_SCARCE;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
331
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
332 rv = NGX_HTTP_CACHE_SCARCE;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
333
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
334 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
335 c->temp_file = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
336 rv = NGX_DECLINED;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339
3696
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
340 if (ngx_http_file_cache_name(r, cache->path) != NGX_OK) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
341 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
342 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
343
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
344 if (!test) {
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
345 goto done;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
346 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
347
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
348 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
349
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
350 ngx_memzero(&of, sizeof(ngx_open_file_info_t));
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
352 of.uniq = c->uniq;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
353 of.valid = clcf->open_file_cache_valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
354 of.min_uses = clcf->open_file_cache_min_uses;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
355 of.events = clcf->open_file_cache_events;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
356 of.directio = NGX_OPEN_FILE_DIRECTIO_OFF;
3178
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3136
diff changeset
357 of.read_ahead = clcf->read_ahead;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
358
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
359 if (ngx_open_cached_file(clcf->open_file_cache, &c->file.name, &of, r->pool)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
360 != NGX_OK)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
361 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
362 switch (of.err) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
363
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
364 case 0:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
365 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
366
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
367 case NGX_ENOENT:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
368 case NGX_ENOTDIR:
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
369 goto done;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
370
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
371 default:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
372 ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
373 ngx_open_file_n " \"%s\" failed", c->file.name.data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
374 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
375 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
376 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
377
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
378 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
379 "http file cache fd: %d", of.fd);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
380
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
381 c->file.fd = of.fd;
2603
f9bd7999eb08 fix segfault if ngx_read_file() will fail
Igor Sysoev <igor@sysoev.ru>
parents: 2600
diff changeset
382 c->file.log = r->connection->log;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
383 c->uniq = of.uniq;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
384 c->length = of.size;
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
385 c->fs_size = (of.fs_size + cache->bsize - 1) / cache->bsize;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
386
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
387 c->buf = ngx_create_temp_buf(r->pool, c->body_start);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
388 if (c->buf == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
389 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
390 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
391
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
392 return ngx_http_file_cache_read(r, c);
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
393
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
394 done:
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
395
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
396 if (rv == NGX_DECLINED) {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
397 return ngx_http_file_cache_lock(r, c);
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
398 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
399
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
400 return rv;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
401 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
402
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
403
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
404 static ngx_int_t
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
405 ngx_http_file_cache_lock(ngx_http_request_t *r, ngx_http_cache_t *c)
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
406 {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
407 ngx_msec_t now, timer;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
408 ngx_http_file_cache_t *cache;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
409
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
410 if (!c->lock) {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
411 return NGX_DECLINED;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
412 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
413
5905
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
414 now = ngx_current_msec;
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
415
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
416 cache = c->file_cache;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
417
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
418 ngx_shmtx_lock(&cache->shpool->mutex);
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
419
5905
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
420 timer = c->node->lock_time - now;
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
421
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
422 if (!c->node->updating || (ngx_msec_int_t) timer <= 0) {
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
423 c->node->updating = 1;
5905
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
424 c->node->lock_time = now + c->lock_age;
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
425 c->updating = 1;
5905
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
426 c->lock_time = c->node->lock_time;
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
427 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
428
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
429 ngx_shmtx_unlock(&cache->shpool->mutex);
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
430
4387
e8181eeddaf8 Fixed build without debug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4385
diff changeset
431 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
432 "http file cache lock u:%d wt:%M",
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
433 c->updating, c->wait_time);
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
434
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
435 if (c->updating) {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
436 return NGX_DECLINED;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
437 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
438
5905
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
439 if (c->lock_timeout == 0) {
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
440 return NGX_HTTP_CACHE_SCARCE;
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
441 }
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
442
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
443 c->waiting = 1;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
444
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
445 if (c->wait_time == 0) {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
446 c->wait_time = now + c->lock_timeout;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
447
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
448 c->wait_event.handler = ngx_http_file_cache_lock_wait_handler;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
449 c->wait_event.data = r;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
450 c->wait_event.log = r->connection->log;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
451 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
452
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
453 timer = c->wait_time - now;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
454
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
455 ngx_add_timer(&c->wait_event, (timer > 500) ? 500 : timer);
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
456
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
457 r->main->blocked++;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
458
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
459 return NGX_AGAIN;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
460 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
461
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
462
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
463 static void
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
464 ngx_http_file_cache_lock_wait_handler(ngx_event_t *ev)
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
465 {
5928
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
466 ngx_connection_t *c;
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
467 ngx_http_request_t *r;
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
468
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
469 r = ev->data;
5928
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
470 c = r->connection;
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
471
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
472 ngx_http_set_log_request(c->log, r);
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
473
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
474 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
475 "http file cache wait: \"%V?%V\"", &r->uri, &r->args);
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
476
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
477 ngx_http_file_cache_lock_wait(r, r->cache);
5929
f436e9a60b8f Cache: proper wakeup of subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5928
diff changeset
478
f436e9a60b8f Cache: proper wakeup of subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5928
diff changeset
479 ngx_http_run_posted_requests(c);
5928
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
480 }
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
481
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
482
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
483 static void
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
484 ngx_http_file_cache_lock_wait(ngx_http_request_t *r, ngx_http_cache_t *c)
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
485 {
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
486 ngx_uint_t wait;
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
487 ngx_msec_t now, timer;
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
488 ngx_http_file_cache_t *cache;
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
489
5905
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
490 now = ngx_current_msec;
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
491
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
492 timer = c->wait_time - now;
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
493
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
494 if ((ngx_msec_int_t) timer <= 0) {
5928
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
495 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
496 "cache lock timeout");
5905
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
497 c->lock_timeout = 0;
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
498 goto wakeup;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
499 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
500
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
501 cache = c->file_cache;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
502 wait = 0;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
503
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
504 ngx_shmtx_lock(&cache->shpool->mutex);
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
505
5905
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
506 timer = c->node->lock_time - now;
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
507
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
508 if (c->node->updating && (ngx_msec_int_t) timer > 0) {
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
509 wait = 1;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
510 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
511
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
512 ngx_shmtx_unlock(&cache->shpool->mutex);
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
513
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
514 if (wait) {
5928
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
515 ngx_add_timer(&c->wait_event, (timer > 500) ? 500 : timer);
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
516 return;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
517 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
518
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
519 wakeup:
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
520
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
521 c->waiting = 0;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
522 r->main->blocked--;
5929
f436e9a60b8f Cache: proper wakeup of subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5928
diff changeset
523 r->write_event_handler(r);
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
524 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
525
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
526
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
527 static ngx_int_t
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
528 ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c)
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
529 {
6243
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
530 u_char *p;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
531 time_t now;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
532 ssize_t n;
6243
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
533 ngx_str_t *key;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
534 ngx_int_t rc;
6243
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
535 ngx_uint_t i;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
536 ngx_http_file_cache_t *cache;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
537 ngx_http_file_cache_header_t *h;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
538
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
539 n = ngx_http_file_cache_aio_read(r, c);
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
540
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
541 if (n < 0) {
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 return n;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
543 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
544
3369
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3294
diff changeset
545 if ((size_t) n < c->header_start) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
546 ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
547 "cache file \"%s\" is too small", c->file.name.data);
3971
44f4fc874b2f do not close connection if cache file is too small: replace it with valid one
Igor Sysoev <igor@sysoev.ru>
parents: 3970
diff changeset
548 return NGX_DECLINED;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
549 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
551 h = (ngx_http_file_cache_header_t *) c->buf->pos;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552
5736
2fe1967f8854 Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5726
diff changeset
553 if (h->version != NGX_HTTP_CACHE_VERSION) {
2fe1967f8854 Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5726
diff changeset
554 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
2fe1967f8854 Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5726
diff changeset
555 "cache file \"%s\" version mismatch", c->file.name.data);
2fe1967f8854 Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5726
diff changeset
556 return NGX_DECLINED;
2fe1967f8854 Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5726
diff changeset
557 }
2fe1967f8854 Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5726
diff changeset
558
6860
f18c285c2e59 Win32: fixed some warnings reported by Borland C.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6795
diff changeset
559 if (h->crc32 != c->crc32 || (size_t) h->header_start != c->header_start) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
560 ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
561 "cache file \"%s\" has md5 collision", c->file.name.data);
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562 return NGX_DECLINED;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
563 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
564
6243
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
565 p = c->buf->pos + sizeof(ngx_http_file_cache_header_t)
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
566 + sizeof(ngx_http_file_cache_key);
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
567
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
568 key = c->keys.elts;
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
569 for (i = 0; i < c->keys.nelts; i++) {
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
570 if (ngx_memcmp(p, key[i].data, key[i].len) != 0) {
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
571 ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
572 "cache file \"%s\" has md5 collision",
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
573 c->file.name.data);
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
574 return NGX_DECLINED;
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
575 }
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
576
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
577 p += key[i].len;
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
578 }
4821fc788c12 Cache: check the whole cache key in addition to hashes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6063
diff changeset
579
5359
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5341
diff changeset
580 if ((size_t) h->body_start > c->body_start) {
4339
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
581 ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
582 "cache file \"%s\" has too long header",
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
583 c->file.name.data);
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
584 return NGX_DECLINED;
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
585 }
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
586
5878
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
587 if (h->vary_len > NGX_HTTP_CACHE_VARY_LEN) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
588 ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
589 "cache file \"%s\" has incorrect vary length",
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
590 c->file.name.data);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
591 return NGX_DECLINED;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
592 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
593
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
594 if (h->vary_len) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
595 ngx_http_file_cache_vary(r, h->vary, h->vary_len, c->variant);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
596
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
597 if (ngx_memcmp(c->variant, h->variant, NGX_HTTP_CACHE_KEY_LEN) != 0) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
598 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
599 "http file cache vary mismatch");
5880
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
600 return ngx_http_file_cache_reopen(r, c);
5878
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
601 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
602 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
603
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
604 c->buf->last += n;
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
605
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
606 c->valid_sec = h->valid_sec;
6905
9a9e13686869 Cache: support for stale-while-revalidate and stale-if-error.
Roman Arutyunyan <arut@nginx.com>
parents: 6860
diff changeset
607 c->updating_sec = h->updating_sec;
9a9e13686869 Cache: support for stale-while-revalidate and stale-if-error.
Roman Arutyunyan <arut@nginx.com>
parents: 6860
diff changeset
608 c->error_sec = h->error_sec;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
609 c->last_modified = h->last_modified;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
610 c->date = h->date;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
611 c->valid_msec = h->valid_msec;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
612 c->body_start = h->body_start;
5737
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
613 c->etag.len = h->etag_len;
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
614 c->etag.data = h->etag;
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
615
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
616 r->cached = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
617
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
618 cache = c->file_cache;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
619
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
620 if (cache->sh->cold) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
621
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
622 ngx_shmtx_lock(&cache->shpool->mutex);
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
623
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
624 if (!c->node->exists) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
625 c->node->uses = 1;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
626 c->node->body_start = c->body_start;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
627 c->node->exists = 1;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
628 c->node->uniq = c->uniq;
4034
e2c075e774b6 Cache size accounting fix: actual cache size on disk was less than
Igor Sysoev <igor@sysoev.ru>
parents: 4018
diff changeset
629 c->node->fs_size = c->fs_size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
630
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
631 cache->sh->size += c->fs_size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
632 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
633
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
634 ngx_shmtx_unlock(&cache->shpool->mutex);
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
636
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
637 now = ngx_time();
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
638
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
639 if (c->valid_sec < now) {
6905
9a9e13686869 Cache: support for stale-while-revalidate and stale-if-error.
Roman Arutyunyan <arut@nginx.com>
parents: 6860
diff changeset
640 c->stale_updating = c->valid_sec + c->updating_sec >= now;
9a9e13686869 Cache: support for stale-while-revalidate and stale-if-error.
Roman Arutyunyan <arut@nginx.com>
parents: 6860
diff changeset
641 c->stale_error = c->valid_sec + c->error_sec >= now;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
642
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
643 ngx_shmtx_lock(&cache->shpool->mutex);
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
644
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
645 if (c->node->updating) {
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
646 rc = NGX_HTTP_CACHE_UPDATING;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
647
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
648 } else {
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
649 c->node->updating = 1;
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
650 c->updating = 1;
5905
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
651 c->lock_time = c->node->lock_time;
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
652 rc = NGX_HTTP_CACHE_STALE;
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
653 }
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
654
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
655 ngx_shmtx_unlock(&cache->shpool->mutex);
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
656
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
657 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
658 "http file cache expired: %i %T %T",
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
659 rc, c->valid_sec, now);
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
660
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
661 return rc;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
662 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
664 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
665 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
666
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
667
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
668 static ssize_t
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
669 ngx_http_file_cache_aio_read(ngx_http_request_t *r, ngx_http_cache_t *c)
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
670 {
6063
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
671 #if (NGX_HAVE_FILE_AIO || NGX_THREADS)
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
672 ssize_t n;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
673 ngx_http_core_loc_conf_t *clcf;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
674
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
675 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
6063
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
676 #endif
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
677
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
678 #if (NGX_HAVE_FILE_AIO)
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
679
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
680 if (clcf->aio == NGX_HTTP_AIO_ON && ngx_file_aio) {
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
681 n = ngx_file_aio_read(&c->file, c->buf->pos, c->body_start, 0, r->pool);
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
682
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
683 if (n != NGX_AGAIN) {
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
684 c->reading = 0;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
685 return n;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
686 }
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
687
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
688 c->reading = 1;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
689
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
690 c->file.aio->data = r;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
691 c->file.aio->handler = ngx_http_cache_aio_event_handler;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
692
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
693 r->main->blocked++;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
694 r->aio = 1;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
695
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
696 return NGX_AGAIN;
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
697 }
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
698
6063
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
699 #endif
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
700
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
701 #if (NGX_THREADS)
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
702
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
703 if (clcf->aio == NGX_HTTP_AIO_THREADS) {
6441
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6243
diff changeset
704 c->file.thread_task = c->thread_task;
6063
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
705 c->file.thread_handler = ngx_http_cache_thread_handler;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
706 c->file.thread_ctx = r;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
707
6441
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6243
diff changeset
708 n = ngx_thread_read(&c->file, c->buf->pos, c->body_start, 0, r->pool);
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6243
diff changeset
709
9fd738b85fad Threads: task pointer stored in ngx_file_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6243
diff changeset
710 c->thread_task = c->file.thread_task;
6063
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
711 c->reading = (n == NGX_AGAIN);
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
712
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
713 return n;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
714 }
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
715
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
716 #endif
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
717
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
718 return ngx_read_file(&c->file, c->buf->pos, c->body_start, 0);
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
719 }
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
720
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
721
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
722 #if (NGX_HAVE_FILE_AIO)
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
723
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
724 static void
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
725 ngx_http_cache_aio_event_handler(ngx_event_t *ev)
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
726 {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
727 ngx_event_aio_t *aio;
5928
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
728 ngx_connection_t *c;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
729 ngx_http_request_t *r;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
730
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
731 aio = ev->data;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
732 r = aio->data;
5928
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
733 c = r->connection;
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
734
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
735 ngx_http_set_log_request(c->log, r);
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
736
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
737 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
8dfee01ff0bd Upstream: improved subrequest logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5905
diff changeset
738 "http file cache aio: \"%V?%V\"", &r->uri, &r->args);
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
739
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
740 r->main->blocked--;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
741 r->aio = 0;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
742
5929
f436e9a60b8f Cache: proper wakeup of subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5928
diff changeset
743 r->write_event_handler(r);
f436e9a60b8f Cache: proper wakeup of subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5928
diff changeset
744
f436e9a60b8f Cache: proper wakeup of subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5928
diff changeset
745 ngx_http_run_posted_requests(c);
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
746 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
747
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
748 #endif
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
749
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
750
6063
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
751 #if (NGX_THREADS)
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
752
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
753 static ngx_int_t
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
754 ngx_http_cache_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
755 {
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
756 ngx_str_t name;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
757 ngx_thread_pool_t *tp;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
758 ngx_http_request_t *r;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
759 ngx_http_core_loc_conf_t *clcf;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
760
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
761 r = file->thread_ctx;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
762
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
763 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
764 tp = clcf->thread_pool;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
765
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
766 if (tp == NULL) {
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
767 if (ngx_http_complex_value(r, clcf->thread_pool_value, &name)
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
768 != NGX_OK)
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
769 {
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
770 return NGX_ERROR;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
771 }
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
772
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
773 tp = ngx_thread_pool_get((ngx_cycle_t *) ngx_cycle, &name);
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
774
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
775 if (tp == NULL) {
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
776 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
777 "thread pool \"%V\" not found", &name);
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
778 return NGX_ERROR;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
779 }
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
780 }
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
781
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
782 task->event.data = r;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
783 task->event.handler = ngx_http_cache_thread_event_handler;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
784
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
785 if (ngx_thread_task_post(tp, task) != NGX_OK) {
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
786 return NGX_ERROR;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
787 }
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
788
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
789 r->main->blocked++;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
790 r->aio = 1;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
791
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
792 return NGX_OK;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
793 }
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
794
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
795
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
796 static void
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
797 ngx_http_cache_thread_event_handler(ngx_event_t *ev)
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
798 {
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
799 ngx_connection_t *c;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
800 ngx_http_request_t *r;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
801
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
802 r = ev->data;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
803 c = r->connection;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
804
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
805 ngx_http_set_log_request(c->log, r);
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
806
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
807 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
808 "http file cache thread: \"%V?%V\"", &r->uri, &r->args);
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
809
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
810 r->main->blocked--;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
811 r->aio = 0;
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
812
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
813 r->write_event_handler(r);
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
814
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
815 ngx_http_run_posted_requests(c);
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
816 }
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
817
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
818 #endif
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
819
d698c300b9ff Cache: added support for reading of the header in thread pools.
Valentin Bartenev <vbart@nginx.com>
parents: 6022
diff changeset
820
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
821 static ngx_int_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
822 ngx_http_file_cache_exists(ngx_http_file_cache_t *cache, ngx_http_cache_t *c)
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
823 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
824 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
825 ngx_http_file_cache_node_t *fcn;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
826
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
827 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
828
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
829 fcn = c->node;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
830
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
831 if (fcn == NULL) {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
832 fcn = ngx_http_file_cache_lookup(cache, c->key);
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
833 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
834
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
835 if (fcn) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
836 ngx_queue_remove(&fcn->queue);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
837
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
838 if (c->node == NULL) {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
839 fcn->uses++;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
840 fcn->count++;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
841 }
3724
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
842
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
843 if (fcn->error) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
844
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
845 if (fcn->valid_sec < ngx_time()) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
846 goto renew;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
847 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
848
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
849 rc = NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
850
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
851 goto done;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
852 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
853
3966
9c425f22ea36 fuse two if's in one condition
Igor Sysoev <igor@sysoev.ru>
parents: 3965
diff changeset
854 if (fcn->exists || fcn->uses >= c->min_uses) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
855
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
856 c->exists = fcn->exists;
7705
3781de64e747 Cache: keep c->body_start when Vary changes (ticket #2029).
Sergey Kandaurov <pluknet@nginx.com>
parents: 7704
diff changeset
857 if (fcn->body_start && !c->update_variant) {
3967
83e41f6f6d96 The cache loader performs two tasks: inserting cache objects in inactivity
Igor Sysoev <igor@sysoev.ru>
parents: 3966
diff changeset
858 c->body_start = fcn->body_start;
83e41f6f6d96 The cache loader performs two tasks: inserting cache objects in inactivity
Igor Sysoev <igor@sysoev.ru>
parents: 3966
diff changeset
859 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
860
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
861 rc = NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
862
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
863 goto done;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
864 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
865
3966
9c425f22ea36 fuse two if's in one condition
Igor Sysoev <igor@sysoev.ru>
parents: 3965
diff changeset
866 rc = NGX_AGAIN;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
867
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
868 goto done;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
869 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
870
5726
25ade23cf281 Core: added ngx_slab_calloc() and ngx_slab_calloc_locked().
Ruslan Ermilov <ru@nginx.com>
parents: 5679
diff changeset
871 fcn = ngx_slab_calloc_locked(cache->shpool,
25ade23cf281 Core: added ngx_slab_calloc() and ngx_slab_calloc_locked().
Ruslan Ermilov <ru@nginx.com>
parents: 5679
diff changeset
872 sizeof(ngx_http_file_cache_node_t));
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
873 if (fcn == NULL) {
6445
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
874 ngx_http_file_cache_set_watermark(cache);
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
875
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
876 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
877
2693
197cda0e767e style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2671
diff changeset
878 (void) ngx_http_file_cache_forced_expire(cache);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
879
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
880 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
881
5726
25ade23cf281 Core: added ngx_slab_calloc() and ngx_slab_calloc_locked().
Ruslan Ermilov <ru@nginx.com>
parents: 5679
diff changeset
882 fcn = ngx_slab_calloc_locked(cache->shpool,
25ade23cf281 Core: added ngx_slab_calloc() and ngx_slab_calloc_locked().
Ruslan Ermilov <ru@nginx.com>
parents: 5679
diff changeset
883 sizeof(ngx_http_file_cache_node_t));
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
884 if (fcn == NULL) {
5822
063f7e75f9ef Upstream: suppressed the file cache slab allocator error messages.
Roman Arutyunyan <arut@nginx.com>
parents: 5737
diff changeset
885 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
063f7e75f9ef Upstream: suppressed the file cache slab allocator error messages.
Roman Arutyunyan <arut@nginx.com>
parents: 5737
diff changeset
886 "could not allocate node%s", cache->shpool->log_ctx);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
887 rc = NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
888 goto failed;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
889 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
890 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
891
6445
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
892 cache->sh->count++;
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
893
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
894 ngx_memcpy((u_char *) &fcn->node.key, c->key, sizeof(ngx_rbtree_key_t));
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
895
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
896 ngx_memcpy(fcn->key, &c->key[sizeof(ngx_rbtree_key_t)],
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
897 NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
898
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
899 ngx_rbtree_insert(&cache->sh->rbtree, &fcn->node);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
900
3724
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
901 fcn->uses = 1;
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
902 fcn->count = 1;
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
903
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
904 renew:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
905
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
906 rc = NGX_DECLINED;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
907
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
908 fcn->valid_msec = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
909 fcn->error = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
910 fcn->exists = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
911 fcn->valid_sec = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
912 fcn->uniq = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
913 fcn->body_start = 0;
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
914 fcn->fs_size = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
915
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
916 done:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
917
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
918 fcn->expire = ngx_time() + cache->inactive;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
919
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
920 ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
921
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
922 c->uniq = fcn->uniq;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
923 c->error = fcn->error;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
924 c->node = fcn;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
925
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
926 failed:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
927
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
928 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
929
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
930 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
931 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
932
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
933
3696
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
934 static ngx_int_t
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
935 ngx_http_file_cache_name(ngx_http_request_t *r, ngx_path_t *path)
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
936 {
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
937 u_char *p;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
938 ngx_http_cache_t *c;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
939
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
940 c = r->cache;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
941
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
942 if (c->file.name.len) {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
943 return NGX_OK;
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
944 }
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
945
3696
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
946 c->file.name.len = path->name.len + 1 + path->len
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
947 + 2 * NGX_HTTP_CACHE_KEY_LEN;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
948
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
949 c->file.name.data = ngx_pnalloc(r->pool, c->file.name.len + 1);
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
950 if (c->file.name.data == NULL) {
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
951 return NGX_ERROR;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
952 }
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
953
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
954 ngx_memcpy(c->file.name.data, path->name.data, path->name.len);
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
955
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
956 p = c->file.name.data + path->name.len + 1 + path->len;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
957 p = ngx_hex_dump(p, c->key, NGX_HTTP_CACHE_KEY_LEN);
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
958 *p = '\0';
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
959
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
960 ngx_create_hashed_filename(path, c->file.name.data, c->file.name.len);
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
961
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
962 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
963 "cache file: \"%s\"", c->file.name.data);
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
964
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
965 return NGX_OK;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
966 }
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
967
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
968
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
969 static ngx_http_file_cache_node_t *
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
970 ngx_http_file_cache_lookup(ngx_http_file_cache_t *cache, u_char *key)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
971 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
972 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
973 ngx_rbtree_key_t node_key;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
974 ngx_rbtree_node_t *node, *sentinel;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
975 ngx_http_file_cache_node_t *fcn;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
976
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
977 ngx_memcpy((u_char *) &node_key, key, sizeof(ngx_rbtree_key_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
978
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
979 node = cache->sh->rbtree.root;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
980 sentinel = cache->sh->rbtree.sentinel;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
981
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
982 while (node != sentinel) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
983
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
984 if (node_key < node->key) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
985 node = node->left;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
986 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
987 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
988
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
989 if (node_key > node->key) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
990 node = node->right;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
991 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
992 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
993
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
994 /* node_key == node->key */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
995
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
996 fcn = (ngx_http_file_cache_node_t *) node;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
997
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
998 rc = ngx_memcmp(&key[sizeof(ngx_rbtree_key_t)], fcn->key,
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
999 NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t));
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1000
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
1001 if (rc == 0) {
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
1002 return fcn;
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
1003 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1004
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
1005 node = (rc < 0) ? node->left : node->right;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1006 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1007
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1008 /* not found */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1009
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1010 return NULL;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1011 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1012
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1013
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1014 static void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1015 ngx_http_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1016 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1017 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1018 ngx_rbtree_node_t **p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1019 ngx_http_file_cache_node_t *cn, *cnt;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1020
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1021 for ( ;; ) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1022
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1023 if (node->key < temp->key) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1024
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1025 p = &temp->left;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1026
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1027 } else if (node->key > temp->key) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1028
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1029 p = &temp->right;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1030
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1031 } else { /* node->key == temp->key */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1032
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1033 cn = (ngx_http_file_cache_node_t *) node;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1034 cnt = (ngx_http_file_cache_node_t *) temp;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1035
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1036 p = (ngx_memcmp(cn->key, cnt->key,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1037 NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t))
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1038 < 0)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1039 ? &temp->left : &temp->right;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1040 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1041
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1042 if (*p == sentinel) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1043 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1044 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1045
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1046 temp = *p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1047 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1048
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1049 *p = node;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1050 node->parent = temp;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1051 node->left = sentinel;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1052 node->right = sentinel;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1053 ngx_rbt_red(node);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1054 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1055
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1056
5878
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1057 static void
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1058 ngx_http_file_cache_vary(ngx_http_request_t *r, u_char *vary, size_t len,
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1059 u_char *hash)
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1060 {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1061 u_char *p, *last;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1062 ngx_str_t name;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1063 ngx_md5_t md5;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1064 u_char buf[NGX_HTTP_CACHE_VARY_LEN];
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1065
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1066 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1067 "http file cache vary: \"%*s\"", len, vary);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1068
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1069 ngx_md5_init(&md5);
5880
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1070 ngx_md5_update(&md5, r->cache->main, NGX_HTTP_CACHE_KEY_LEN);
5878
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1071
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1072 ngx_strlow(buf, vary, len);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1073
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1074 p = buf;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1075 last = buf + len;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1076
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1077 while (p < last) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1078
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1079 while (p < last && (*p == ' ' || *p == ',')) { p++; }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1080
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1081 name.data = p;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1082
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1083 while (p < last && *p != ',' && *p != ' ') { p++; }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1084
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1085 name.len = p - name.data;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1086
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1087 if (name.len == 0) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1088 break;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1089 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1090
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1091 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1092 "http file cache vary: %V", &name);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1093
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1094 ngx_md5_update(&md5, name.data, name.len);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1095 ngx_md5_update(&md5, (u_char *) ":", sizeof(":") - 1);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1096
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1097 ngx_http_file_cache_vary_header(r, &md5, &name);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1098
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1099 ngx_md5_update(&md5, (u_char *) CRLF, sizeof(CRLF) - 1);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1100 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1101
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1102 ngx_md5_final(hash, &md5);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1103 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1104
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1105
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1106 static void
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1107 ngx_http_file_cache_vary_header(ngx_http_request_t *r, ngx_md5_t *md5,
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1108 ngx_str_t *name)
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1109 {
5881
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1110 size_t len;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1111 u_char *p, *start, *last;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1112 ngx_uint_t i, multiple, normalize;
5878
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1113 ngx_list_part_t *part;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1114 ngx_table_elt_t *header;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1115
5881
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1116 multiple = 0;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1117 normalize = 0;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1118
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1119 if (name->len == sizeof("Accept-Charset") - 1
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1120 && ngx_strncasecmp(name->data, (u_char *) "Accept-Charset",
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1121 sizeof("Accept-Charset") - 1) == 0)
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1122 {
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1123 normalize = 1;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1124
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1125 } else if (name->len == sizeof("Accept-Encoding") - 1
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1126 && ngx_strncasecmp(name->data, (u_char *) "Accept-Encoding",
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1127 sizeof("Accept-Encoding") - 1) == 0)
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1128 {
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1129 normalize = 1;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1130
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1131 } else if (name->len == sizeof("Accept-Language") - 1
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1132 && ngx_strncasecmp(name->data, (u_char *) "Accept-Language",
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1133 sizeof("Accept-Language") - 1) == 0)
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1134 {
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1135 normalize = 1;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1136 }
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1137
5878
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1138 part = &r->headers_in.headers.part;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1139 header = part->elts;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1140
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1141 for (i = 0; /* void */ ; i++) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1142
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1143 if (i >= part->nelts) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1144 if (part->next == NULL) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1145 break;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1146 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1147
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1148 part = part->next;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1149 header = part->elts;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1150 i = 0;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1151 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1152
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1153 if (header[i].hash == 0) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1154 continue;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1155 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1156
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1157 if (header[i].key.len != name->len) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1158 continue;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1159 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1160
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1161 if (ngx_strncasecmp(header[i].key.data, name->data, name->len) != 0) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1162 continue;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1163 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1164
5881
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1165 if (!normalize) {
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1166
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1167 if (multiple) {
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1168 ngx_md5_update(md5, (u_char *) ",", sizeof(",") - 1);
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1169 }
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1170
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1171 ngx_md5_update(md5, header[i].value.data, header[i].value.len);
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1172
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1173 multiple = 1;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1174
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1175 continue;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1176 }
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1177
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1178 /* normalize spaces */
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1179
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1180 p = header[i].value.data;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1181 last = p + header[i].value.len;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1182
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1183 while (p < last) {
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1184
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1185 while (p < last && (*p == ' ' || *p == ',')) { p++; }
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1186
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1187 start = p;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1188
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1189 while (p < last && *p != ',' && *p != ' ') { p++; }
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1190
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1191 len = p - start;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1192
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1193 if (len == 0) {
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1194 break;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1195 }
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1196
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1197 if (multiple) {
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1198 ngx_md5_update(md5, (u_char *) ",", sizeof(",") - 1);
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1199 }
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1200
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1201 ngx_md5_update(md5, start, len);
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1202
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1203 multiple = 1;
ee9230cd4bda Cache: normalization of some Vary headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5880
diff changeset
1204 }
5878
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1205 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1206 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1207
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1208
5880
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1209 static ngx_int_t
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1210 ngx_http_file_cache_reopen(ngx_http_request_t *r, ngx_http_cache_t *c)
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1211 {
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1212 ngx_http_file_cache_t *cache;
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1213
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1214 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->file.log, 0,
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1215 "http file cache reopen");
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1216
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1217 if (c->secondary) {
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1218 ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1219 "cache file \"%s\" has incorrect vary hash",
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1220 c->file.name.data);
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1221 return NGX_DECLINED;
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1222 }
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1223
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1224 cache = c->file_cache;
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1225
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1226 ngx_shmtx_lock(&cache->shpool->mutex);
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1227
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1228 c->node->count--;
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1229 c->node = NULL;
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1230
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1231 ngx_shmtx_unlock(&cache->shpool->mutex);
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1232
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1233 c->secondary = 1;
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1234 c->file.name.len = 0;
7704
847fd35f94de Cache: reset c->body_start when reading a variant on Vary mismatch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7670
diff changeset
1235 c->body_start = c->buffer_size;
5880
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1236
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1237 ngx_memcpy(c->key, c->variant, NGX_HTTP_CACHE_KEY_LEN);
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1238
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1239 return ngx_http_file_cache_open(r);
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1240 }
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1241
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1242
5959
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1243 ngx_int_t
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1244 ngx_http_file_cache_set_header(ngx_http_request_t *r, u_char *buf)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1245 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1246 ngx_http_file_cache_header_t *h = (ngx_http_file_cache_header_t *) buf;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1247
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1248 u_char *p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1249 ngx_str_t *key;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1250 ngx_uint_t i;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1251 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1252
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1253 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1254 "http file cache set header");
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1255
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1256 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1257
5245
711fa02afae8 Valgrind: supressed complaints about uninitialized bytes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5077
diff changeset
1258 ngx_memzero(h, sizeof(ngx_http_file_cache_header_t));
711fa02afae8 Valgrind: supressed complaints about uninitialized bytes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5077
diff changeset
1259
5736
2fe1967f8854 Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5726
diff changeset
1260 h->version = NGX_HTTP_CACHE_VERSION;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1261 h->valid_sec = c->valid_sec;
6905
9a9e13686869 Cache: support for stale-while-revalidate and stale-if-error.
Roman Arutyunyan <arut@nginx.com>
parents: 6860
diff changeset
1262 h->updating_sec = c->updating_sec;
9a9e13686869 Cache: support for stale-while-revalidate and stale-if-error.
Roman Arutyunyan <arut@nginx.com>
parents: 6860
diff changeset
1263 h->error_sec = c->error_sec;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1264 h->last_modified = c->last_modified;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1265 h->date = c->date;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1266 h->crc32 = c->crc32;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1267 h->valid_msec = (u_short) c->valid_msec;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1268 h->header_start = (u_short) c->header_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1269 h->body_start = (u_short) c->body_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1270
5737
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
1271 if (c->etag.len <= NGX_HTTP_CACHE_ETAG_LEN) {
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
1272 h->etag_len = (u_char) c->etag.len;
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
1273 ngx_memcpy(h->etag, c->etag.data, c->etag.len);
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
1274 }
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
1275
5878
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1276 if (c->vary.len) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1277 if (c->vary.len > NGX_HTTP_CACHE_VARY_LEN) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1278 /* should not happen */
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1279 c->vary.len = NGX_HTTP_CACHE_VARY_LEN;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1280 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1281
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1282 h->vary_len = (u_char) c->vary.len;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1283 ngx_memcpy(h->vary, c->vary.data, c->vary.len);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1284
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1285 ngx_http_file_cache_vary(r, c->vary.data, c->vary.len, c->variant);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1286 ngx_memcpy(h->variant, c->variant, NGX_HTTP_CACHE_KEY_LEN);
5959
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1287 }
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1288
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1289 if (ngx_http_file_cache_update_variant(r, c) != NGX_OK) {
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1290 return NGX_ERROR;
5878
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1291 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1292
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1293 p = buf + sizeof(ngx_http_file_cache_header_t);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1294
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1295 p = ngx_cpymem(p, ngx_http_file_cache_key, sizeof(ngx_http_file_cache_key));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1296
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1297 key = c->keys.elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1298 for (i = 0; i < c->keys.nelts; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1299 p = ngx_copy(p, key[i].data, key[i].len);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1300 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1301
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1302 *p = LF;
5959
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1303
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1304 return NGX_OK;
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1305 }
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1306
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1307
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1308 static ngx_int_t
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1309 ngx_http_file_cache_update_variant(ngx_http_request_t *r, ngx_http_cache_t *c)
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1310 {
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1311 ngx_http_file_cache_t *cache;
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1312
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1313 if (!c->secondary) {
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1314 return NGX_OK;
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1315 }
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1316
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1317 if (c->vary.len
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1318 && ngx_memcmp(c->variant, c->key, NGX_HTTP_CACHE_KEY_LEN) == 0)
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1319 {
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1320 return NGX_OK;
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1321 }
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1322
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1323 /*
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1324 * if the variant hash doesn't match one we used as a secondary
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1325 * cache key, switch back to the original key
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1326 */
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1327
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1328 cache = c->file_cache;
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1329
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1330 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1331 "http file cache main key");
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1332
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1333 ngx_shmtx_lock(&cache->shpool->mutex);
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1334
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1335 c->node->count--;
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1336 c->node->updating = 0;
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1337 c->node = NULL;
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1338
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1339 ngx_shmtx_unlock(&cache->shpool->mutex);
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1340
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1341 c->file.name.len = 0;
7705
3781de64e747 Cache: keep c->body_start when Vary changes (ticket #2029).
Sergey Kandaurov <pluknet@nginx.com>
parents: 7704
diff changeset
1342 c->update_variant = 1;
5959
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1343
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1344 ngx_memcpy(c->key, c->main, NGX_HTTP_CACHE_KEY_LEN);
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1345
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1346 if (ngx_http_file_cache_exists(cache, c) == NGX_ERROR) {
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1347 return NGX_ERROR;
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1348 }
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1349
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1350 if (ngx_http_file_cache_name(r, cache->path) != NGX_OK) {
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1351 return NGX_ERROR;
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1352 }
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1353
f7584d7c0ccb Cache: update variant while setting header.
Valentin Bartenev <vbart@nginx.com>
parents: 5951
diff changeset
1354 return NGX_OK;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1355 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1356
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1357
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1358 void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1359 ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1360 {
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
1361 off_t fs_size;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1362 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1363 ngx_file_uniq_t uniq;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1364 ngx_file_info_t fi;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1365 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1366 ngx_ext_rename_file_t ext;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1367 ngx_http_file_cache_t *cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1368
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1369 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1370
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1371 if (c->updated) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1372 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1373 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1374
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1375 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1376 "http file cache update");
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1377
5880
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1378 cache = c->file_cache;
78c49e243848 Cache: multiple variants of a resource now can be stored.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5879
diff changeset
1379
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1380 c->updated = 1;
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1381 c->updating = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1382
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1383 uniq = 0;
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
1384 fs_size = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1385
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1386 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1387 "http file cache rename: \"%s\" to \"%s\"",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1388 tf->file.name.data, c->file.name.data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1389
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1390 ext.access = NGX_FILE_OWNER_ACCESS;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1391 ext.path_access = NGX_FILE_OWNER_ACCESS;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1392 ext.time = -1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1393 ext.create_path = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1394 ext.delete_file = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1395 ext.log = r->connection->log;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1396
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1397 rc = ngx_ext_rename_file(&tf->file.name, &c->file.name, &ext);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1398
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1399 if (rc == NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1400
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1401 if (ngx_fd_info(tf->file.fd, &fi) == NGX_FILE_ERROR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1402 ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1403 ngx_fd_info_n " \"%s\" failed", tf->file.name.data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1404
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1405 rc = NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1406
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1407 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1408 uniq = ngx_file_uniq(&fi);
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
1409 fs_size = (ngx_file_fs_size(&fi) + cache->bsize - 1) / cache->bsize;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1410 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1411 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1412
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1413 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1414
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1415 c->node->count--;
6539
d94f57990492 Cache: fixed updating bypassed cached errors (ticket #827).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6478
diff changeset
1416 c->node->error = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1417 c->node->uniq = uniq;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1418 c->node->body_start = c->body_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1419
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
1420 cache->sh->size += fs_size - c->node->fs_size;
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
1421 c->node->fs_size = fs_size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1422
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1423 if (rc == NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1424 c->node->exists = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1425 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1426
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
1427 c->node->updating = 0;
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
1428
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1429 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1430 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1431
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1432
5441
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1433 void
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1434 ngx_http_file_cache_update_header(ngx_http_request_t *r)
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1435 {
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1436 ssize_t n;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1437 ngx_err_t err;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1438 ngx_file_t file;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1439 ngx_file_info_t fi;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1440 ngx_http_cache_t *c;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1441 ngx_http_file_cache_header_t h;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1442
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1443 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1444 "http file cache update header");
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1445
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1446 c = r->cache;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1447
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1448 ngx_memzero(&file, sizeof(ngx_file_t));
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1449
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1450 file.name = c->file.name;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1451 file.log = r->connection->log;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1452 file.fd = ngx_open_file(file.name.data, NGX_FILE_RDWR, NGX_FILE_OPEN, 0);
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1453
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1454 if (file.fd == NGX_INVALID_FILE) {
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1455 err = ngx_errno;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1456
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1457 /* cache file may have been deleted */
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1458
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1459 if (err == NGX_ENOENT) {
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1460 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1461 "http file cache \"%s\" not found",
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1462 file.name.data);
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1463 return;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1464 }
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1465
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1466 ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1467 ngx_open_file_n " \"%s\" failed", file.name.data);
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1468 return;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1469 }
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1470
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1471 /*
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1472 * make sure cache file wasn't replaced;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1473 * if it was, do nothing
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1474 */
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1475
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1476 if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1477 ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1478 ngx_fd_info_n " \"%s\" failed", file.name.data);
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1479 goto done;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1480 }
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1481
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1482 if (c->uniq != ngx_file_uniq(&fi)
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1483 || c->length != ngx_file_size(&fi))
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1484 {
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1485 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1486 "http file cache \"%s\" changed",
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1487 file.name.data);
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1488 goto done;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1489 }
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1490
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1491 n = ngx_read_file(&file, (u_char *) &h,
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1492 sizeof(ngx_http_file_cache_header_t), 0);
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1493
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1494 if (n == NGX_ERROR) {
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1495 goto done;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1496 }
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1497
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1498 if ((size_t) n != sizeof(ngx_http_file_cache_header_t)) {
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1499 ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1500 ngx_read_file_n " read only %z of %z from \"%s\"",
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1501 n, sizeof(ngx_http_file_cache_header_t), file.name.data);
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1502 goto done;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1503 }
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1504
5736
2fe1967f8854 Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5726
diff changeset
1505 if (h.version != NGX_HTTP_CACHE_VERSION
2fe1967f8854 Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5726
diff changeset
1506 || h.last_modified != c->last_modified
5441
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1507 || h.crc32 != c->crc32
6860
f18c285c2e59 Win32: fixed some warnings reported by Borland C.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6795
diff changeset
1508 || (size_t) h.header_start != c->header_start
f18c285c2e59 Win32: fixed some warnings reported by Borland C.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6795
diff changeset
1509 || (size_t) h.body_start != c->body_start)
5441
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1510 {
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1511 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1512 "http file cache \"%s\" content changed",
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1513 file.name.data);
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1514 goto done;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1515 }
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1516
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1517 /*
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1518 * update cache file header with new data,
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1519 * notably h.valid_sec and h.date
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1520 */
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1521
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1522 ngx_memzero(&h, sizeof(ngx_http_file_cache_header_t));
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1523
5736
2fe1967f8854 Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5726
diff changeset
1524 h.version = NGX_HTTP_CACHE_VERSION;
5441
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1525 h.valid_sec = c->valid_sec;
6905
9a9e13686869 Cache: support for stale-while-revalidate and stale-if-error.
Roman Arutyunyan <arut@nginx.com>
parents: 6860
diff changeset
1526 h.updating_sec = c->updating_sec;
9a9e13686869 Cache: support for stale-while-revalidate and stale-if-error.
Roman Arutyunyan <arut@nginx.com>
parents: 6860
diff changeset
1527 h.error_sec = c->error_sec;
5441
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1528 h.last_modified = c->last_modified;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1529 h.date = c->date;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1530 h.crc32 = c->crc32;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1531 h.valid_msec = (u_short) c->valid_msec;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1532 h.header_start = (u_short) c->header_start;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1533 h.body_start = (u_short) c->body_start;
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1534
5737
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
1535 if (c->etag.len <= NGX_HTTP_CACHE_ETAG_LEN) {
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
1536 h.etag_len = (u_char) c->etag.len;
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
1537 ngx_memcpy(h.etag, c->etag.data, c->etag.len);
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
1538 }
44b9ab7752e3 Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5736
diff changeset
1539
5878
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1540 if (c->vary.len) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1541 if (c->vary.len > NGX_HTTP_CACHE_VARY_LEN) {
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1542 /* should not happen */
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1543 c->vary.len = NGX_HTTP_CACHE_VARY_LEN;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1544 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1545
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1546 h.vary_len = (u_char) c->vary.len;
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1547 ngx_memcpy(h.vary, c->vary.data, c->vary.len);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1548
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1549 ngx_http_file_cache_vary(r, c->vary.data, c->vary.len, c->variant);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1550 ngx_memcpy(h.variant, c->variant, NGX_HTTP_CACHE_KEY_LEN);
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1551 }
2c89956b6a76 Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5822
diff changeset
1552
5441
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1553 (void) ngx_write_file(&file, (u_char *) &h,
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1554 sizeof(ngx_http_file_cache_header_t), 0);
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1555
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1556 done:
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1557
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1558 if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1559 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1560 ngx_close_file_n " \"%s\" failed", file.name.data);
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1561 }
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1562 }
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1563
43ccaf8e8728 Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
1564
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1565 ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1566 ngx_http_cache_send(ngx_http_request_t *r)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1567 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1568 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1569 ngx_buf_t *b;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1570 ngx_chain_t out;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1571 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1572
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1573 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1574
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1575 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3965
90b0487fba44 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3942
diff changeset
1576 "http file cache send: %s", c->file.name.data);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1577
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1578 /* we need to allocate all before the header would be sent */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1579
6973
99934aade555 Use ngx_calloc_buf() where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 6906
diff changeset
1580 b = ngx_calloc_buf(r->pool);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1581 if (b == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1582 return NGX_HTTP_INTERNAL_SERVER_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1583 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1584
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1585 b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1586 if (b->file == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1587 return NGX_HTTP_INTERNAL_SERVER_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1588 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1589
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1590 rc = ngx_http_send_header(r);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1591
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1592 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1593 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1594 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1595
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1596 b->file_pos = c->body_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1597 b->file_last = c->length;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1598
8123
Maxim Dounin <mdounin@mdounin.ru>
parents: 8005
diff changeset
1599 b->in_file = (c->length - c->body_start) ? 1 : 0;
Maxim Dounin <mdounin@mdounin.ru>
parents: 8005
diff changeset
1600 b->last_buf = (r == r->main) ? 1 : 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1601 b->last_in_chain = 1;
8124
f5515e727656 Fixed "zero size buf" alerts with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8123
diff changeset
1602 b->sync = (b->last_buf || b->in_file) ? 0 : 1;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1603
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1604 b->file->fd = c->file.fd;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1605 b->file->name = c->file.name;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1606 b->file->log = r->connection->log;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1607
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1608 out.buf = b;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1609 out.next = NULL;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1610
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1611 return ngx_http_output_filter(r, &out);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1612 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1613
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1614
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1615 void
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1616 ngx_http_file_cache_free(ngx_http_cache_t *c, ngx_temp_file_t *tf)
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1617 {
3694
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
1618 ngx_http_file_cache_t *cache;
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
1619 ngx_http_file_cache_node_t *fcn;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1620
3917
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3899
diff changeset
1621 if (c->updated || c->node == NULL) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1622 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1623 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1624
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1625 cache = c->file_cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1626
3713
f0b62d1ac7af move debug logging inside ngx_http_file_cache_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3711
diff changeset
1627 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->file.log, 0,
f0b62d1ac7af move debug logging inside ngx_http_file_cache_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3711
diff changeset
1628 "http file cache free, fd: %d", c->file.fd);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1629
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1630 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1631
3694
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
1632 fcn = c->node;
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
1633 fcn->count--;
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1634
5905
2f7e557eab5b Cache: proxy_cache_lock_age and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 5898
diff changeset
1635 if (c->updating && fcn->lock_time == c->lock_time) {
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1636 fcn->updating = 0;
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1637 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1638
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1639 if (c->error) {
3694
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
1640 fcn->error = c->error;
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
1641
3743
c469ffeab569 error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents: 3732
diff changeset
1642 if (c->valid_sec) {
c469ffeab569 error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents: 3732
diff changeset
1643 fcn->valid_sec = c->valid_sec;
c469ffeab569 error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents: 3732
diff changeset
1644 fcn->valid_msec = c->valid_msec;
c469ffeab569 error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents: 3732
diff changeset
1645 }
c469ffeab569 error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents: 3732
diff changeset
1646
3723
14ad3210fc73 do not free unused cache node if cache min_uses > 1,
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
1647 } else if (!fcn->exists && fcn->count == 0 && c->min_uses == 1) {
3694
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
1648 ngx_queue_remove(&fcn->queue);
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
1649 ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
1650 ngx_slab_free_locked(cache->shpool, fcn);
6445
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
1651 cache->sh->count--;
3694
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
1652 c->node = NULL;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1653 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1654
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1655 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1656
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1657 c->updated = 1;
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1658 c->updating = 0;
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1659
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1660 if (c->temp_file) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1661 if (tf && tf->file.fd != NGX_INVALID_FILE) {
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1662 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->file.log, 0,
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1663 "http file cache incomplete: \"%s\"",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1664 tf->file.name.data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1665
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1666 if (ngx_delete_file(tf->file.name.data) == NGX_FILE_ERROR) {
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1667 ngx_log_error(NGX_LOG_CRIT, c->file.log, ngx_errno,
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1668 ngx_delete_file_n " \"%s\" failed",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1669 tf->file.name.data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1670 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1671 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1672 }
4385
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
1673
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
1674 if (c->wait_event.timer_set) {
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
1675 ngx_del_timer(&c->wait_event);
70ba81827472 Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4340
diff changeset
1676 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1677 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1678
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1679
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1680 static void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1681 ngx_http_file_cache_cleanup(void *data)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1682 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1683 ngx_http_cache_t *c = data;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1684
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1685 if (c->updated) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1686 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1687 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1688
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1689 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->file.log, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1690 "http file cache cleanup");
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1691
6906
1aeaae6e9446 Upstream: proxy_cache_background_update and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6905
diff changeset
1692 if (c->updating && !c->background) {
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1693 ngx_log_error(NGX_LOG_ALERT, c->file.log, 0,
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1694 "stalled cache updating, error:%ui", c->error);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1695 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1696
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
1697 ngx_http_file_cache_free(c, NULL);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1698 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1699
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1700
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1701 static time_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1702 ngx_http_file_cache_forced_expire(ngx_http_file_cache_t *cache)
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1703 {
7002
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1704 u_char *name, *p;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1705 size_t len;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1706 time_t wait;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1707 ngx_uint_t tries;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1708 ngx_path_t *path;
7002
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1709 ngx_queue_t *q, *sentinel;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1710 ngx_http_file_cache_node_t *fcn;
7002
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1711 u_char key[2 * NGX_HTTP_CACHE_KEY_LEN];
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1712
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1713 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1714 "http file cache forced expire");
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1715
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1716 path = cache->path;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1717 len = path->name.len + 1 + path->len + 2 * NGX_HTTP_CACHE_KEY_LEN;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1718
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1719 name = ngx_alloc(len + 1, ngx_cycle->log);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1720 if (name == NULL) {
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1721 return 10;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1722 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1723
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1724 ngx_memcpy(name, path->name.data, path->name.len);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1725
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1726 wait = 10;
3728
a29bb11f8c80 change logic slightly
Igor Sysoev <igor@sysoev.ru>
parents: 3727
diff changeset
1727 tries = 20;
7002
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1728 sentinel = NULL;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1729
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1730 ngx_shmtx_lock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1731
7002
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1732 for ( ;; ) {
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1733 if (ngx_queue_empty(&cache->sh->queue)) {
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1734 break;
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1735 }
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1736
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1737 q = ngx_queue_last(&cache->sh->queue);
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1738
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1739 if (q == sentinel) {
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1740 break;
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1741 }
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1742
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1743 fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1744
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1745 ngx_log_debug6(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1746 "http file cache forced expire: #%d %d %02xd%02xd%02xd%02xd",
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1747 fcn->count, fcn->exists,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1748 fcn->key[0], fcn->key[1], fcn->key[2], fcn->key[3]);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1749
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1750 if (fcn->count == 0) {
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1751 ngx_http_file_cache_delete(cache, q, name);
3885
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
1752 wait = 0;
7002
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1753 break;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1754 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1755
8005
dd718d1cef3c Cache: fixed race in ngx_http_file_cache_forced_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7705
diff changeset
1756 if (fcn->deleting) {
dd718d1cef3c Cache: fixed race in ngx_http_file_cache_forced_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7705
diff changeset
1757 wait = 1;
dd718d1cef3c Cache: fixed race in ngx_http_file_cache_forced_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7705
diff changeset
1758 break;
dd718d1cef3c Cache: fixed race in ngx_http_file_cache_forced_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7705
diff changeset
1759 }
dd718d1cef3c Cache: fixed race in ngx_http_file_cache_forced_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7705
diff changeset
1760
7002
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1761 p = ngx_hex_dump(key, (u_char *) &fcn->node.key,
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1762 sizeof(ngx_rbtree_key_t));
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1763 len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1764 (void) ngx_hex_dump(p, fcn->key, len);
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1765
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1766 /*
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1767 * abnormally exited workers may leave locked cache entries,
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1768 * and although it may be safe to remove them completely,
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1769 * we prefer to just move them to the top of the inactive queue
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1770 */
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1771
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1772 ngx_queue_remove(q);
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1773 fcn->expire = ngx_time() + cache->inactive;
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1774 ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1775
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1776 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1777 "ignore long locked inactive cache entry %*s, count:%d",
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1778 (size_t) 2 * NGX_HTTP_CACHE_KEY_LEN, key, fcn->count);
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1779
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1780 if (sentinel == NULL) {
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1781 sentinel = q;
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1782 }
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1783
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1784 if (--tries) {
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1785 continue;
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1786 }
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1787
ab199f0eb8e8 Cache: ignore long locked entries during forced expire.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6973
diff changeset
1788 wait = 1;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1789 break;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1790 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1791
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1792 ngx_shmtx_unlock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1793
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1794 ngx_free(name);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1795
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1796 return wait;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1797 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1798
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1799
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1800 static time_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1801 ngx_http_file_cache_expire(ngx_http_file_cache_t *cache)
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1802 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1803 u_char *name, *p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1804 size_t len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1805 time_t now, wait;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1806 ngx_path_t *path;
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1807 ngx_msec_t elapsed;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1808 ngx_queue_t *q;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1809 ngx_http_file_cache_node_t *fcn;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1810 u_char key[2 * NGX_HTTP_CACHE_KEY_LEN];
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1811
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1812 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1813 "http file cache expire");
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1814
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1815 path = cache->path;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1816 len = path->name.len + 1 + path->len + 2 * NGX_HTTP_CACHE_KEY_LEN;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1817
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1818 name = ngx_alloc(len + 1, ngx_cycle->log);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1819 if (name == NULL) {
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1820 return 10;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1821 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1822
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1823 ngx_memcpy(name, path->name.data, path->name.len);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1824
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1825 now = ngx_time();
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1826
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1827 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1828
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1829 for ( ;; ) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1830
5679
5748ce74c1cc Cache: added ngx_quit check to ngx_http_file_cache_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5441
diff changeset
1831 if (ngx_quit || ngx_terminate) {
5748ce74c1cc Cache: added ngx_quit check to ngx_http_file_cache_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5441
diff changeset
1832 wait = 1;
5748ce74c1cc Cache: added ngx_quit check to ngx_http_file_cache_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5441
diff changeset
1833 break;
5748ce74c1cc Cache: added ngx_quit check to ngx_http_file_cache_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5441
diff changeset
1834 }
5748ce74c1cc Cache: added ngx_quit check to ngx_http_file_cache_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5441
diff changeset
1835
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1836 if (ngx_queue_empty(&cache->sh->queue)) {
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1837 wait = 10;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1838 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1839 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1840
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1841 q = ngx_queue_last(&cache->sh->queue);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1842
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1843 fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1844
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1845 wait = fcn->expire - now;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1846
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1847 if (wait > 0) {
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1848 wait = wait > 10 ? 10 : wait;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1849 break;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1850 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1851
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1852 ngx_log_debug6(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1853 "http file cache expire: #%d %d %02xd%02xd%02xd%02xd",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1854 fcn->count, fcn->exists,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1855 fcn->key[0], fcn->key[1], fcn->key[2], fcn->key[3]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1856
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1857 if (fcn->count == 0) {
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1858 ngx_http_file_cache_delete(cache, q, name);
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1859 goto next;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1860 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1861
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1862 if (fcn->deleting) {
3942
2e8dbd773d63 fix r3756: release lock to allow other process to delete cache node
Igor Sysoev <igor@sysoev.ru>
parents: 3917
diff changeset
1863 wait = 1;
2e8dbd773d63 fix r3756: release lock to allow other process to delete cache node
Igor Sysoev <igor@sysoev.ru>
parents: 3917
diff changeset
1864 break;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1865 }
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1866
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1867 p = ngx_hex_dump(key, (u_char *) &fcn->node.key,
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1868 sizeof(ngx_rbtree_key_t));
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1869 len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1870 (void) ngx_hex_dump(p, fcn->key, len);
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1871
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1872 /*
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1873 * abnormally exited workers may leave locked cache entries,
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1874 * and although it may be safe to remove them completely,
4340
4533d7684e14 Cache: only complain on long locked entries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4339
diff changeset
1875 * we prefer to just move them to the top of the inactive queue
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1876 */
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1877
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1878 ngx_queue_remove(q);
4340
4533d7684e14 Cache: only complain on long locked entries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4339
diff changeset
1879 fcn->expire = ngx_time() + cache->inactive;
4533d7684e14 Cache: only complain on long locked entries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4339
diff changeset
1880 ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1881
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1882 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1883 "ignore long locked inactive cache entry %*s, count:%d",
6478
3ef7bb882ad4 Fixed logging with variable field width.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6450
diff changeset
1884 (size_t) 2 * NGX_HTTP_CACHE_KEY_LEN, key, fcn->count);
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1885
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1886 next:
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1887
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1888 if (++cache->files >= cache->manager_files) {
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1889 wait = 0;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1890 break;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1891 }
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1892
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1893 ngx_time_update();
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1894
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1895 elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last));
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1896
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1897 if (elapsed >= cache->manager_threshold) {
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1898 wait = 0;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1899 break;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1900 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1901 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1902
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1903 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1904
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1905 ngx_free(name);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1906
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1907 return wait;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1908 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1909
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1910
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1911 static void
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1912 ngx_http_file_cache_delete(ngx_http_file_cache_t *cache, ngx_queue_t *q,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1913 u_char *name)
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1914 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1915 u_char *p;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1916 size_t len;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1917 ngx_path_t *path;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1918 ngx_http_file_cache_node_t *fcn;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1919
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1920 fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1921
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1922 if (fcn->exists) {
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
1923 cache->sh->size -= fcn->fs_size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1924
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1925 path = cache->path;
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1926 p = name + path->name.len + 1 + path->len;
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1927 p = ngx_hex_dump(p, (u_char *) &fcn->node.key,
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1928 sizeof(ngx_rbtree_key_t));
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1929 len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1930 p = ngx_hex_dump(p, fcn->key, len);
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1931 *p = '\0';
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1932
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1933 fcn->count++;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1934 fcn->deleting = 1;
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1935 ngx_shmtx_unlock(&cache->shpool->mutex);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1936
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1937 len = path->name.len + 1 + path->len + 2 * NGX_HTTP_CACHE_KEY_LEN;
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1938 ngx_create_hashed_filename(path, name, len);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1939
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1940 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1941 "http file cache expire: \"%s\"", name);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1942
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1943 if (ngx_delete_file(name) == NGX_FILE_ERROR) {
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1944 ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno,
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1945 ngx_delete_file_n " \"%s\" failed", name);
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1946 }
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1947
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1948 ngx_shmtx_lock(&cache->shpool->mutex);
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1949 fcn->count--;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1950 fcn->deleting = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1951 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1952
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1953 if (fcn->count == 0) {
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1954 ngx_queue_remove(q);
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1955 ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1956 ngx_slab_free_locked(cache->shpool, fcn);
6445
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
1957 cache->sh->count--;
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1958 }
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1959 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1960
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1961
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1962 static ngx_msec_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1963 ngx_http_file_cache_manager(void *data)
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1964 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1965 ngx_http_file_cache_t *cache = data;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1966
7670
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
1967 off_t size, free;
6742
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
1968 time_t wait;
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
1969 ngx_msec_t elapsed, next;
6445
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
1970 ngx_uint_t count, watermark;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1971
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1972 cache->last = ngx_current_msec;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1973 cache->files = 0;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1974
6742
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
1975 next = (ngx_msec_t) ngx_http_file_cache_expire(cache) * 1000;
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1976
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1977 if (next == 0) {
6742
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
1978 next = cache->manager_sleep;
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
1979 goto done;
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1980 }
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
1981
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1982 for ( ;; ) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1983 ngx_shmtx_lock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1984
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1985 size = cache->sh->size;
6445
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
1986 count = cache->sh->count;
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
1987 watermark = cache->sh->watermark;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1988
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1989 ngx_shmtx_unlock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1990
6445
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
1991 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
1992 "http file cache size: %O c:%ui w:%i",
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
1993 size, count, (ngx_int_t) watermark);
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
1994
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
1995 if (size < cache->max_size && count < watermark) {
7670
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
1996
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
1997 if (!cache->min_free) {
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
1998 break;
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
1999 }
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2000
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2001 free = ngx_fs_available(cache->path->name.data);
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2002
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2003 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2004 "http file cache free: %O", free);
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2005
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2006 if (free > cache->min_free) {
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2007 break;
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2008 }
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2009 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2010
3885
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
2011 wait = ngx_http_file_cache_forced_expire(cache);
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
2012
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
2013 if (wait > 0) {
6742
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2014 next = (ngx_msec_t) wait * 1000;
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2015 break;
3885
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
2016 }
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2017
3972
c1a69e03bdf2 rename ngx_http_file_cache_manager_sleep() to ngx_http_file_cache_loader_sleep()
Igor Sysoev <igor@sysoev.ru>
parents: 3971
diff changeset
2018 if (ngx_quit || ngx_terminate) {
6742
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2019 break;
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2020 }
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2021
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2022 if (++cache->files >= cache->manager_files) {
6742
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2023 next = cache->manager_sleep;
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2024 break;
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2025 }
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2026
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2027 ngx_time_update();
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2028
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2029 elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last));
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2030
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2031 if (elapsed >= cache->manager_threshold) {
6742
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2032 next = cache->manager_sleep;
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2033 break;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2034 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2035 }
6742
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2036
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2037 done:
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2038
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2039 elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last));
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2040
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2041 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2042 "http file cache manager: %ui e:%M n:%M",
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2043 cache->files, elapsed, next);
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2044
3fbb3bdff824 Cache: cache manager debugging.
Ruslan Ermilov <ru@nginx.com>
parents: 6727
diff changeset
2045 return next;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2046 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2047
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2048
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2049 static void
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2050 ngx_http_file_cache_loader(void *data)
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2051 {
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2052 ngx_http_file_cache_t *cache = data;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2053
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2054 ngx_tree_ctx_t tree;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2055
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2056 if (!cache->sh->cold || cache->sh->loading) {
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2057 return;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2058 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2059
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2060 if (!ngx_atomic_cmp_set(&cache->sh->loading, 0, ngx_pid)) {
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2061 return;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2062 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2063
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2064 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2065 "http file cache loader");
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2066
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2067 tree.init_handler = NULL;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2068 tree.file_handler = ngx_http_file_cache_manage_file;
5968
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2069 tree.pre_tree_handler = ngx_http_file_cache_manage_directory;
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2070 tree.post_tree_handler = ngx_http_file_cache_noop;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2071 tree.spec_handler = ngx_http_file_cache_delete_file;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2072 tree.data = cache;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2073 tree.alloc = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2074 tree.log = ngx_cycle->log;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2075
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2076 cache->last = ngx_current_msec;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2077 cache->files = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2078
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2079 if (ngx_walk_tree(&tree, &cache->path->name) == NGX_ABORT) {
3020
364ea8f54a2f unlock incompletely loaded cache
Igor Sysoev <igor@sysoev.ru>
parents: 3018
diff changeset
2080 cache->sh->loading = 0;
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2081 return;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2082 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2083
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2084 cache->sh->cold = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2085 cache->sh->loading = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2086
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2087 ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2088 "http file cache: %V %.3fM, bsize: %uz",
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2089 &cache->path->name,
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2090 ((double) cache->sh->size * cache->bsize) / (1024 * 1024),
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2091 cache->bsize);
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2092 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2093
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2094
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2095 static ngx_int_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2096 ngx_http_file_cache_noop(ngx_tree_ctx_t *ctx, ngx_str_t *path)
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2097 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2098 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2099 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2100
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2101
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2102 static ngx_int_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2103 ngx_http_file_cache_manage_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2104 {
4018
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2105 ngx_msec_t elapsed;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2106 ngx_http_file_cache_t *cache;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2107
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2108 cache = ctx->data;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2109
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2110 if (ngx_http_file_cache_add_file(ctx, path) != NGX_OK) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2111 (void) ngx_http_file_cache_delete_file(ctx, path);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2112 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2113
4018
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2114 if (++cache->files >= cache->loader_files) {
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2115 ngx_http_file_cache_loader_sleep(cache);
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2116
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2117 } else {
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2118 ngx_time_update();
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2119
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2120 elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last));
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2121
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2122 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2123 "http file cache loader time elapsed: %M", elapsed);
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2124
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2125 if (elapsed >= cache->loader_threshold) {
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2126 ngx_http_file_cache_loader_sleep(cache);
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2127 }
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2128 }
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2129
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2130 return (ngx_quit || ngx_terminate) ? NGX_ABORT : NGX_OK;
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2131 }
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2132
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2133
5968
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2134 static ngx_int_t
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2135 ngx_http_file_cache_manage_directory(ngx_tree_ctx_t *ctx, ngx_str_t *path)
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2136 {
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2137 if (path->len >= 5
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2138 && ngx_strncmp(path->data + path->len - 5, "/temp", 5) == 0)
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2139 {
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2140 return NGX_DECLINED;
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2141 }
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2142
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2143 return NGX_OK;
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2144 }
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2145
99639bfdfa2a Cache: added temp_path to file cache.
Roman Arutyunyan <arut@nginx.com>
parents: 5960
diff changeset
2146
4018
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2147 static void
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2148 ngx_http_file_cache_loader_sleep(ngx_http_file_cache_t *cache)
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2149 {
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2150 ngx_msleep(cache->loader_sleep);
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2151
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2152 ngx_time_update();
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2153
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2154 cache->last = ngx_current_msec;
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
2155 cache->files = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2156 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2157
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2158
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2159 static ngx_int_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2160 ngx_http_file_cache_add_file(ngx_tree_ctx_t *ctx, ngx_str_t *name)
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2161 {
3970
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
2162 u_char *p;
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
2163 ngx_int_t n;
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
2164 ngx_uint_t i;
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
2165 ngx_http_cache_t c;
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
2166 ngx_http_file_cache_t *cache;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2167
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2168 if (name->len < 2 * NGX_HTTP_CACHE_KEY_LEN) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2169 return NGX_ERROR;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2170 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2171
6795
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2172 /*
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2173 * Temporary files in cache have a suffix consisting of a dot
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2174 * followed by 10 digits.
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2175 */
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2176
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2177 if (name->len >= 2 * NGX_HTTP_CACHE_KEY_LEN + 1 + 10
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2178 && name->data[name->len - 10 - 1] == '.')
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2179 {
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2180 return NGX_OK;
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2181 }
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2182
3970
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
2183 if (ctx->size < (off_t) sizeof(ngx_http_file_cache_header_t)) {
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2184 ngx_log_error(NGX_LOG_CRIT, ctx->log, 0,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2185 "cache file \"%s\" is too small", name->data);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2186 return NGX_ERROR;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2187 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2188
3970
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
2189 ngx_memzero(&c, sizeof(ngx_http_cache_t));
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
2190 cache = ctx->data;
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
2191
3970
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
2192 c.length = ctx->size;
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
2193 c.fs_size = (ctx->fs_size + cache->bsize - 1) / cache->bsize;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2194
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2195 p = &name->data[name->len - 2 * NGX_HTTP_CACHE_KEY_LEN];
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2196
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2197 for (i = 0; i < NGX_HTTP_CACHE_KEY_LEN; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2198 n = ngx_hextoi(p, 2);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2199
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2200 if (n == NGX_ERROR) {
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2201 return NGX_ERROR;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2202 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2203
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2204 p += 2;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2205
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2206 c.key[i] = (u_char) n;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2207 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2208
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2209 return ngx_http_file_cache_add(cache, &c);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2210 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2211
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2212
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2213 static ngx_int_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2214 ngx_http_file_cache_add(ngx_http_file_cache_t *cache, ngx_http_cache_t *c)
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2215 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2216 ngx_http_file_cache_node_t *fcn;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2217
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2218 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2219
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2220 fcn = ngx_http_file_cache_lookup(cache, c->key);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2221
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2222 if (fcn == NULL) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2223
5726
25ade23cf281 Core: added ngx_slab_calloc() and ngx_slab_calloc_locked().
Ruslan Ermilov <ru@nginx.com>
parents: 5679
diff changeset
2224 fcn = ngx_slab_calloc_locked(cache->shpool,
25ade23cf281 Core: added ngx_slab_calloc() and ngx_slab_calloc_locked().
Ruslan Ermilov <ru@nginx.com>
parents: 5679
diff changeset
2225 sizeof(ngx_http_file_cache_node_t));
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2226 if (fcn == NULL) {
6445
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2227 ngx_http_file_cache_set_watermark(cache);
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2228
6444
043914d19be8 Cache: report error if slab allocator fails during cache loading.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6441
diff changeset
2229 if (cache->fail_time != ngx_time()) {
043914d19be8 Cache: report error if slab allocator fails during cache loading.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6441
diff changeset
2230 cache->fail_time = ngx_time();
043914d19be8 Cache: report error if slab allocator fails during cache loading.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6441
diff changeset
2231 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
043914d19be8 Cache: report error if slab allocator fails during cache loading.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6441
diff changeset
2232 "could not allocate node%s", cache->shpool->log_ctx);
043914d19be8 Cache: report error if slab allocator fails during cache loading.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6441
diff changeset
2233 }
043914d19be8 Cache: report error if slab allocator fails during cache loading.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6441
diff changeset
2234
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2235 ngx_shmtx_unlock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2236 return NGX_ERROR;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2237 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2238
6450
22c32937a41f Cache: fixed slots accounting error introduced in c9d680b00744.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6445
diff changeset
2239 cache->sh->count++;
22c32937a41f Cache: fixed slots accounting error introduced in c9d680b00744.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6445
diff changeset
2240
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2241 ngx_memcpy((u_char *) &fcn->node.key, c->key, sizeof(ngx_rbtree_key_t));
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2242
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2243 ngx_memcpy(fcn->key, &c->key[sizeof(ngx_rbtree_key_t)],
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2244 NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t));
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2245
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
2246 ngx_rbtree_insert(&cache->sh->rbtree, &fcn->node);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2247
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2248 fcn->uses = 1;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2249 fcn->exists = 1;
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
2250 fcn->fs_size = c->fs_size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2251
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
2252 cache->sh->size += c->fs_size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2253
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2254 } else {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2255 ngx_queue_remove(&fcn->queue);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2256 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2257
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2258 fcn->expire = ngx_time() + cache->inactive;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2259
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
2260 ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2261
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2262 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2263
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2264 return NGX_OK;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2265 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2266
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2267
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2268 static ngx_int_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2269 ngx_http_file_cache_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2270 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2271 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2272 "http file cache delete: \"%s\"", path->data);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2273
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2274 if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2275 ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2276 ngx_delete_file_n " \"%s\" failed", path->data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2277 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
2278
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2279 return NGX_OK;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2280 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2281
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2282
6445
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2283 static void
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2284 ngx_http_file_cache_set_watermark(ngx_http_file_cache_t *cache)
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2285 {
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2286 cache->sh->watermark = cache->sh->count - cache->sh->count / 8;
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2287
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2288 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2289 "http file cache watermark: %ui", cache->sh->watermark);
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2290 }
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2291
c9d680b00744 Cache: added watermark to reduce IO load when keys_zone is full.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6444
diff changeset
2292
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2293 time_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2294 ngx_http_file_cache_valid(ngx_array_t *cache_valid, ngx_uint_t status)
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2295 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2296 ngx_uint_t i;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2297 ngx_http_cache_valid_t *valid;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2298
2626
b0cfe5f66e8d fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents: 2616
diff changeset
2299 if (cache_valid == NULL) {
b0cfe5f66e8d fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents: 2616
diff changeset
2300 return 0;
b0cfe5f66e8d fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents: 2616
diff changeset
2301 }
b0cfe5f66e8d fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents: 2616
diff changeset
2302
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2303 valid = cache_valid->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2304 for (i = 0; i < cache_valid->nelts; i++) {
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2305
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2306 if (valid[i].status == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2307 return valid[i].valid;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2308 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2309
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2310 if (valid[i].status == status) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2311 return valid[i].valid;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2312 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2313 }
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2314
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2315 return 0;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2316 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2317
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2318
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2319 char *
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2320 ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2321 {
5951
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2322 char *confp = conf;
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2323
7670
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2324 off_t max_size, min_free;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2325 u_char *last, *p;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2326 time_t inactive;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2327 ssize_t size;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2328 ngx_str_t s, name, *value;
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2329 ngx_int_t loader_files, manager_files;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2330 ngx_msec_t loader_sleep, manager_sleep, loader_threshold,
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2331 manager_threshold;
5960
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2332 ngx_uint_t i, n, use_temp_path;
5951
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2333 ngx_array_t *caches;
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2334 ngx_http_file_cache_t *cache, **ce;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2335
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2336 cache = ngx_pcalloc(cf->pool, sizeof(ngx_http_file_cache_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2337 if (cache == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2338 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2339 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2340
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2341 cache->path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2342 if (cache->path == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2343 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2344 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2345
5960
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2346 use_temp_path = 1;
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2347
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2348 inactive = 600;
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2349
3974
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2350 loader_files = 100;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2351 loader_sleep = 50;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2352 loader_threshold = 200;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2353
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2354 manager_files = 100;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2355 manager_sleep = 50;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2356 manager_threshold = 200;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2357
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2358 name.len = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2359 size = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2360 max_size = NGX_MAX_OFF_T_VALUE;
7670
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2361 min_free = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2362
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2363 value = cf->args->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2364
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2365 cache->path->name = value[1];
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2366
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2367 if (cache->path->name.data[cache->path->name.len - 1] == '/') {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2368 cache->path->name.len--;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2369 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2370
5330
314c3d7cc3a5 Backed out f1a91825730a and 7094bd12c1ff.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5317
diff changeset
2371 if (ngx_conf_full_name(cf->cycle, &cache->path->name, 0) != NGX_OK) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2372 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2373 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2374
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2375 for (i = 2; i < cf->args->nelts; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2376
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2377 if (ngx_strncmp(value[i].data, "levels=", 7) == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2378
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2379 p = value[i].data + 7;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2380 last = value[i].data + value[i].len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2381
6617
8bf484eef9ab Use NGX_MAX_PATH_LEVEL where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 6539
diff changeset
2382 for (n = 0; n < NGX_MAX_PATH_LEVEL && p < last; n++) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2383
2671
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
2384 if (*p > '0' && *p < '3') {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2385
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2386 cache->path->level[n] = *p++ - '0';
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2387 cache->path->len += cache->path->level[n] + 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2388
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2389 if (p == last) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2390 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2391 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2392
6617
8bf484eef9ab Use NGX_MAX_PATH_LEVEL where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 6539
diff changeset
2393 if (*p++ == ':' && n < NGX_MAX_PATH_LEVEL - 1 && p < last) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2394 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2395 }
2671
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
2396
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
2397 goto invalid_levels;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2398 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2399
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2400 goto invalid_levels;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2401 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2402
6617
8bf484eef9ab Use NGX_MAX_PATH_LEVEL where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 6539
diff changeset
2403 if (cache->path->len < 10 + NGX_MAX_PATH_LEVEL) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2404 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2405 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2406
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2407 invalid_levels:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2408
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2409 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2410 "invalid \"levels\" \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2411 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2412 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2413
5960
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2414 if (ngx_strncmp(value[i].data, "use_temp_path=", 14) == 0) {
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2415
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2416 if (ngx_strcmp(&value[i].data[14], "on") == 0) {
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2417 use_temp_path = 1;
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2418
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2419 } else if (ngx_strcmp(&value[i].data[14], "off") == 0) {
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2420 use_temp_path = 0;
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2421
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2422 } else {
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2423 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2424 "invalid use_temp_path value \"%V\", "
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2425 "it must be \"on\" or \"off\"",
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2426 &value[i]);
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2427 return NGX_CONF_ERROR;
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2428 }
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2429
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2430 continue;
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2431 }
e9effef98874 Upstream: use_temp_path parameter of proxy_cache_path and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5959
diff changeset
2432
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2433 if (ngx_strncmp(value[i].data, "keys_zone=", 10) == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2434
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2435 name.data = value[i].data + 10;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2436
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2437 p = (u_char *) ngx_strchr(name.data, ':');
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2438
7375
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2439 if (p == NULL) {
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2440 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2441 "invalid keys zone size \"%V\"", &value[i]);
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2442 return NGX_CONF_ERROR;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2443 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2444
7375
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2445 name.len = p - name.data;
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2446
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2447 s.data = p + 1;
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2448 s.len = value[i].data + value[i].len - s.data;
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2449
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2450 size = ngx_parse_size(&s);
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2451
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2452 if (size == NGX_ERROR) {
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2453 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2454 "invalid keys zone size \"%V\"", &value[i]);
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2455 return NGX_CONF_ERROR;
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2456 }
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2457
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2458 if (size < (ssize_t) (2 * ngx_pagesize)) {
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2459 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2460 "keys zone \"%V\" is too small", &value[i]);
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2461 return NGX_CONF_ERROR;
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2462 }
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2463
bddacdaaec9e Cache: improved keys zone size error reporting.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7374
diff changeset
2464 continue;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2465 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2466
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2467 if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2468
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2469 s.len = value[i].len - 9;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2470 s.data = value[i].data + 9;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2471
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2472 inactive = ngx_parse_time(&s, 1);
4474
41f640a693de Time parsing cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
2473 if (inactive == (time_t) NGX_ERROR) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2474 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2475 "invalid inactive value \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2476 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2477 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2478
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2479 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2480 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2481
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2482 if (ngx_strncmp(value[i].data, "max_size=", 9) == 0) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2483
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2484 s.len = value[i].len - 9;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2485 s.data = value[i].data + 9;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2486
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2487 max_size = ngx_parse_offset(&s);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2488 if (max_size < 0) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2489 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2490 "invalid max_size value \"%V\"", &value[i]);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2491 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2492 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2493
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2494 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2495 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2496
7670
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2497 if (ngx_strncmp(value[i].data, "min_free=", 9) == 0) {
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2498
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2499 #if (NGX_WIN32 || NGX_HAVE_STATFS || NGX_HAVE_STATVFS)
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2500
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2501 s.len = value[i].len - 9;
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2502 s.data = value[i].data + 9;
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2503
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2504 min_free = ngx_parse_offset(&s);
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2505 if (min_free < 0) {
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2506 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2507 "invalid min_free value \"%V\"", &value[i]);
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2508 return NGX_CONF_ERROR;
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2509 }
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2510
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2511 #else
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2512 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2513 "min_free is not supported "
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2514 "on this platform, ignored");
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2515 #endif
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2516
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2517 continue;
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2518 }
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2519
3974
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2520 if (ngx_strncmp(value[i].data, "loader_files=", 13) == 0) {
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2521
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2522 loader_files = ngx_atoi(value[i].data + 13, value[i].len - 13);
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2523 if (loader_files == NGX_ERROR) {
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2524 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2525 "invalid loader_files value \"%V\"", &value[i]);
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2526 return NGX_CONF_ERROR;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2527 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2528
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2529 continue;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2530 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2531
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2532 if (ngx_strncmp(value[i].data, "loader_sleep=", 13) == 0) {
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2533
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2534 s.len = value[i].len - 13;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2535 s.data = value[i].data + 13;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2536
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2537 loader_sleep = ngx_parse_time(&s, 0);
4474
41f640a693de Time parsing cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
2538 if (loader_sleep == (ngx_msec_t) NGX_ERROR) {
3974
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2539 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2540 "invalid loader_sleep value \"%V\"", &value[i]);
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2541 return NGX_CONF_ERROR;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2542 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2543
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2544 continue;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2545 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2546
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2547 if (ngx_strncmp(value[i].data, "loader_threshold=", 17) == 0) {
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2548
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2549 s.len = value[i].len - 17;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2550 s.data = value[i].data + 17;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2551
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2552 loader_threshold = ngx_parse_time(&s, 0);
4474
41f640a693de Time parsing cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
2553 if (loader_threshold == (ngx_msec_t) NGX_ERROR) {
3974
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2554 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2555 "invalid loader_threshold value \"%V\"", &value[i]);
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2556 return NGX_CONF_ERROR;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2557 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2558
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2559 continue;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2560 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2561
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2562 if (ngx_strncmp(value[i].data, "manager_files=", 14) == 0) {
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2563
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2564 manager_files = ngx_atoi(value[i].data + 14, value[i].len - 14);
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2565 if (manager_files == NGX_ERROR) {
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2566 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2567 "invalid manager_files value \"%V\"", &value[i]);
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2568 return NGX_CONF_ERROR;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2569 }
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2570
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2571 continue;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2572 }
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2573
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2574 if (ngx_strncmp(value[i].data, "manager_sleep=", 14) == 0) {
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2575
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2576 s.len = value[i].len - 14;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2577 s.data = value[i].data + 14;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2578
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2579 manager_sleep = ngx_parse_time(&s, 0);
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2580 if (manager_sleep == (ngx_msec_t) NGX_ERROR) {
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2581 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2582 "invalid manager_sleep value \"%V\"", &value[i]);
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2583 return NGX_CONF_ERROR;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2584 }
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2585
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2586 continue;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2587 }
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2588
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2589 if (ngx_strncmp(value[i].data, "manager_threshold=", 18) == 0) {
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2590
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2591 s.len = value[i].len - 18;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2592 s.data = value[i].data + 18;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2593
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2594 manager_threshold = ngx_parse_time(&s, 0);
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2595 if (manager_threshold == (ngx_msec_t) NGX_ERROR) {
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2596 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2597 "invalid manager_threshold value \"%V\"", &value[i]);
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2598 return NGX_CONF_ERROR;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2599 }
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2600
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2601 continue;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2602 }
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2603
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2604 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2605 "invalid parameter \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2606 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2607 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2608
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2609 if (name.len == 0 || size == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2610 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2611 "\"%V\" must have \"keys_zone\" parameter",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2612 &cmd->name);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2613 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2614 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2615
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2616 cache->path->manager = ngx_http_file_cache_manager;
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
2617 cache->path->loader = ngx_http_file_cache_loader;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2618 cache->path->data = cache;
3973
9d6f21415231 set correct configuration file values while adding path
Igor Sysoev <igor@sysoev.ru>
parents: 3972
diff changeset
2619 cache->path->conf_file = cf->conf_file->file.name.data;
9d6f21415231 set correct configuration file values while adding path
Igor Sysoev <igor@sysoev.ru>
parents: 3972
diff changeset
2620 cache->path->line = cf->conf_file->line;
3974
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
2621 cache->loader_files = loader_files;
4474
41f640a693de Time parsing cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
2622 cache->loader_sleep = loader_sleep;
41f640a693de Time parsing cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
2623 cache->loader_threshold = loader_threshold;
6727
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2624 cache->manager_files = manager_files;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2625 cache->manager_sleep = manager_sleep;
ca709bca4b77 Cache: cache manager limits.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6617
diff changeset
2626 cache->manager_threshold = manager_threshold;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2627
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2628 if (ngx_add_path(cf, &cache->path) != NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2629 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2630 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2631
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2632 cache->shm_zone = ngx_shared_memory_add(cf, &name, size, cmd->post);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2633 if (cache->shm_zone == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2634 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2635 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2636
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2637 if (cache->shm_zone->data) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2638 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2639 "duplicate zone \"%V\"", &name);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2640 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2641 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2642
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2643
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2644 cache->shm_zone->init = ngx_http_file_cache_init;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2645 cache->shm_zone->data = cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2646
6795
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2647 cache->use_temp_path = use_temp_path;
1a917932db96 Cache: prefix-based temporary files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6742
diff changeset
2648
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2649 cache->inactive = inactive;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
2650 cache->max_size = max_size;
7670
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7375
diff changeset
2651 cache->min_free = min_free;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2652
5951
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2653 caches = (ngx_array_t *) (confp + cmd->offset);
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2654
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2655 ce = ngx_array_push(caches);
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2656 if (ce == NULL) {
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2657 return NGX_CONF_ERROR;
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2658 }
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2659
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2660 *ce = cache;
610832763648 Upstream: added variables support to proxy_cache and friends.
Valentin Bartenev <vbart@nginx.com>
parents: 5935
diff changeset
2661
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2662 return NGX_CONF_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2663 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
2664
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
2665
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2666 char *
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2667 ngx_http_file_cache_valid_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2668 void *conf)
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2669 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2670 char *p = conf;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2671
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2672 time_t valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2673 ngx_str_t *value;
7267
7c614ef3c6ea Cache: fixed cache valid slot to reject incorrect statuses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7075
diff changeset
2674 ngx_int_t status;
7c614ef3c6ea Cache: fixed cache valid slot to reject incorrect statuses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7075
diff changeset
2675 ngx_uint_t i, n;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2676 ngx_array_t **a;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2677 ngx_http_cache_valid_t *v;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2678 static ngx_uint_t statuses[] = { 200, 301, 302 };
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
2679
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2680 a = (ngx_array_t **) (p + cmd->offset);
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2681
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2682 if (*a == NGX_CONF_UNSET_PTR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2683 *a = ngx_array_create(cf->pool, 1, sizeof(ngx_http_cache_valid_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2684 if (*a == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2685 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2686 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2687 }
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2688
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2689 value = cf->args->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2690 n = cf->args->nelts - 1;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2691
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2692 valid = ngx_parse_time(&value[n], 1);
4474
41f640a693de Time parsing cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
2693 if (valid == (time_t) NGX_ERROR) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2694 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2695 "invalid time value \"%V\"", &value[n]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2696 return NGX_CONF_ERROR;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2697 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2698
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2699 if (n == 1) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2700
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2701 for (i = 0; i < 3; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2702 v = ngx_array_push(*a);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2703 if (v == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2704 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2705 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2706
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2707 v->status = statuses[i];
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2708 v->valid = valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2709 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2710
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2711 return NGX_CONF_OK;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2712 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2713
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2714 for (i = 1; i < n; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2715
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2716 if (ngx_strcmp(value[i].data, "any") == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2717
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2718 status = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2719
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2720 } else {
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2721
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2722 status = ngx_atoi(value[i].data, value[i].len);
7359
b5ea47df9bee Cache: status must be less then 599 in *_cache_valid directives.
Gena Makhomed <gmm@csdoc.com>
parents: 7267
diff changeset
2723 if (status < 100 || status > 599) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2724 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2725 "invalid status \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2726 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2727 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2728 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2729
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2730 v = ngx_array_push(*a);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2731 if (v == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2732 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2733 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2734
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2735 v->status = status;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2736 v->valid = valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2737 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2738
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
2739 return NGX_CONF_OK;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2740 }