Mercurial > hg > nginx-quic
annotate src/http/ngx_http_file_cache.c @ 5878:2c89956b6a76
Cache: hash of Vary headers now stored in cache.
To cache responses with Vary, we now calculate hash of headers listed
in Vary, and return the response from cache only if new request headers
match.
As of now, only one variant of the same resource can be stored in cache.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 27 Oct 2014 21:13:58 +0300 |
parents | 063f7e75f9ef |
children | c525c0454aa5 |
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 | 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); |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
17 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
|
18 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
|
19 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
|
20 ngx_http_cache_t *c); |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
21 #if (NGX_HAVE_FILE_AIO) |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
22 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
|
23 #endif |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
24 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
|
25 ngx_http_cache_t *c); |
3696 | 26 static ngx_int_t ngx_http_file_cache_name(ngx_http_request_t *r, |
27 ngx_path_t *path); | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
28 static ngx_http_file_cache_node_t * |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
29 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
|
30 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
|
31 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
|
32 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
|
33 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
|
34 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
|
35 ngx_md5_t *md5, ngx_str_t *name); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
36 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
|
37 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
|
38 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
|
39 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
|
40 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
|
41 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
|
42 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
|
43 ngx_str_t *path); |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
44 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
|
45 ngx_str_t *path); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
46 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
|
47 ngx_str_t *path); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
48 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
|
49 ngx_http_cache_t *c); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
50 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
|
51 ngx_str_t *path); |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
52 |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
53 |
2952 | 54 ngx_str_t ngx_http_cache_status[] = { |
55 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
|
56 ngx_string("BYPASS"), |
2952 | 57 ngx_string("EXPIRED"), |
58 ngx_string("STALE"), | |
59 ngx_string("UPDATING"), | |
5441
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
60 ngx_string("REVALIDATED"), |
2952 | 61 ngx_string("HIT") |
62 }; | |
63 | |
64 | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
65 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
|
66 |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
67 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
68 static ngx_int_t |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
69 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
|
70 { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
71 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
|
72 |
2611
2bce3f6416c6
improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents:
2606
diff
changeset
|
73 size_t len; |
3017
c466605d9426
test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents:
2952
diff
changeset
|
74 ngx_uint_t n; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
75 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
|
76 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
77 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
|
78 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
79 if (ocache) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
80 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
|
81 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
|
82 "cache \"%V\" uses the \"%V\" cache path " |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
83 "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
|
84 &shm_zone->shm.name, &cache->path->name, |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
85 &ocache->path->name); |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
86 |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
87 return NGX_ERROR; |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
88 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
89 |
3017
c466605d9426
test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents:
2952
diff
changeset
|
90 for (n = 0; n < 3; n++) { |
c466605d9426
test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents:
2952
diff
changeset
|
91 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
|
92 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
|
93 "cache \"%V\" had previously different levels", |
c466605d9426
test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents:
2952
diff
changeset
|
94 &shm_zone->shm.name); |
c466605d9426
test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents:
2952
diff
changeset
|
95 return NGX_ERROR; |
c466605d9426
test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents:
2952
diff
changeset
|
96 } |
c466605d9426
test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents:
2952
diff
changeset
|
97 } |
c466605d9426
test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents:
2952
diff
changeset
|
98 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
99 cache->sh = ocache->sh; |
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
100 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
101 cache->shpool = ocache->shpool; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
102 cache->bsize = ocache->bsize; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
103 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
104 cache->max_size /= cache->bsize; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
105 |
3018 | 106 if (!cache->sh->cold || cache->sh->loading) { |
107 cache->path->loader = NULL; | |
108 } | |
109 | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
110 return NGX_OK; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
111 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
112 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
113 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
|
114 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
115 if (shm_zone->shm.exists) { |
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
116 cache->sh = cache->shpool->data; |
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
117 cache->bsize = ngx_fs_bsize(cache->path->name.data); |
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
118 |
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
119 return NGX_OK; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
120 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
121 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
122 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
|
123 if (cache->sh == NULL) { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
124 return NGX_ERROR; |
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 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
127 cache->shpool->data = cache->sh; |
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
128 |
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
129 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
|
130 ngx_http_file_cache_rbtree_insert_value); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
131 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
132 ngx_queue_init(&cache->sh->queue); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
133 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
134 cache->sh->cold = 1; |
3018 | 135 cache->sh->loading = 0; |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
136 cache->sh->size = 0; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
137 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
138 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
|
139 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
140 cache->max_size /= cache->bsize; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
141 |
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
|
142 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
|
143 |
2bce3f6416c6
improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents:
2606
diff
changeset
|
144 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
|
145 if (cache->shpool->log_ctx == NULL) { |
2bce3f6416c6
improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents:
2606
diff
changeset
|
146 return NGX_ERROR; |
2bce3f6416c6
improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents:
2606
diff
changeset
|
147 } |
2bce3f6416c6
improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents:
2606
diff
changeset
|
148 |
2bce3f6416c6
improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents:
2606
diff
changeset
|
149 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
|
150 &shm_zone->shm.name); |
2611
2bce3f6416c6
improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents:
2606
diff
changeset
|
151 |
5822
063f7e75f9ef
Upstream: suppressed the file cache slab allocator error messages.
Roman Arutyunyan <arut@nginx.com>
parents:
5737
diff
changeset
|
152 cache->shpool->log_nomem = 0; |
063f7e75f9ef
Upstream: suppressed the file cache slab allocator error messages.
Roman Arutyunyan <arut@nginx.com>
parents:
5737
diff
changeset
|
153 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
154 return NGX_OK; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
155 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
156 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
157 |
3697 | 158 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
|
159 ngx_http_file_cache_new(ngx_http_request_t *r) |
3697 | 160 { |
161 ngx_http_cache_t *c; | |
162 | |
163 c = ngx_pcalloc(r->pool, sizeof(ngx_http_cache_t)); | |
164 if (c == NULL) { | |
165 return NGX_ERROR; | |
166 } | |
167 | |
168 if (ngx_array_init(&c->keys, r->pool, 4, sizeof(ngx_str_t)) != NGX_OK) { | |
169 return NGX_ERROR; | |
170 } | |
171 | |
172 r->cache = c; | |
173 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
|
174 c->file.fd = NGX_INVALID_FILE; |
3697 | 175 |
176 return NGX_OK; | |
177 } | |
178 | |
179 | |
3699
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
180 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
|
181 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
|
182 { |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
183 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
|
184 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
|
185 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
|
186 |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
187 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
|
188 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
|
189 |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
190 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
|
191 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
|
192 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
|
193 } |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
194 |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
195 cln->handler = ngx_http_file_cache_cleanup; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
196 cln->data = c; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
197 |
3699
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
198 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
|
199 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
|
200 } |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
201 |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
202 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
|
203 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
|
204 } |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
205 |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
206 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
|
207 } |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
208 |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3698
diff
changeset
|
209 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
210 void |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
211 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
|
212 { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
213 size_t len; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
214 ngx_str_t *key; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
215 ngx_uint_t i; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
216 ngx_md5_t md5; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
217 ngx_http_cache_t *c; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
218 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
219 c = r->cache; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
220 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
221 len = 0; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
222 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
223 ngx_crc32_init(c->crc32); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
224 ngx_md5_init(&md5); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
225 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
226 key = c->keys.elts; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
227 for (i = 0; i < c->keys.nelts; i++) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
228 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
|
229 "http cache key: \"%V\"", &key[i]); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
230 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
231 len += key[i].len; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
232 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
233 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
|
234 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
|
235 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
236 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
237 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
|
238 + sizeof(ngx_http_file_cache_key) + len + 1; |
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_final(c->crc32); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
241 ngx_md5_final(c->key, &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 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
244 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
245 ngx_int_t |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
246 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
|
247 { |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
248 ngx_int_t rc, rv; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
249 ngx_uint_t cold, test; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
250 ngx_http_cache_t *c; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
251 ngx_pool_cleanup_t *cln; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
252 ngx_open_file_info_t of; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
253 ngx_http_file_cache_t *cache; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
254 ngx_http_core_loc_conf_t *clcf; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
255 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
256 c = r->cache; |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
257 |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
258 if (c->waiting) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
259 return NGX_AGAIN; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
260 } |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
261 |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
262 if (c->buf) { |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
263 return ngx_http_file_cache_read(r, c); |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
264 } |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
265 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
266 cache = c->file_cache; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
267 |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
268 if (c->node == NULL) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
269 cln = ngx_pool_cleanup_add(r->pool, 0); |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
270 if (cln == NULL) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
271 return NGX_ERROR; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
272 } |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
273 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
274 cln->handler = ngx_http_file_cache_cleanup; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
275 cln->data = c; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
276 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
277 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
278 rc = ngx_http_file_cache_exists(cache, c); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
279 |
2926
80a314b63c56
delete useless r->cache->uses
Igor Sysoev <igor@sysoev.ru>
parents:
2925
diff
changeset
|
280 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
|
281 "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
|
282 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
283 if (rc == NGX_ERROR) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
284 return rc; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
285 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
286 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
287 if (rc == NGX_AGAIN) { |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
288 return NGX_HTTP_CACHE_SCARCE; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
289 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
290 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
291 cold = cache->sh->cold; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
292 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
293 if (rc == NGX_OK) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
294 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
295 if (c->error) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
296 return c->error; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
297 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
298 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
299 c->temp_file = 1; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
300 test = c->exists ? 1 : 0; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
301 rv = NGX_DECLINED; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
302 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
303 } else { /* rc == NGX_DECLINED */ |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
304 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
305 if (c->min_uses > 1) { |
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 if (!cold) { |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
308 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
|
309 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
310 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
311 test = 1; |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
312 rv = NGX_HTTP_CACHE_SCARCE; |
2592
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 } else { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
315 c->temp_file = 1; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
316 test = cold ? 1 : 0; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
317 rv = NGX_DECLINED; |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
318 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
319 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
320 |
3696 | 321 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
|
322 return NGX_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
323 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
324 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
325 if (!test) { |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
326 goto done; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
327 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
328 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
329 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
|
330 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
331 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
|
332 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
333 of.uniq = c->uniq; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
334 of.valid = clcf->open_file_cache_valid; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
335 of.min_uses = clcf->open_file_cache_min_uses; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
336 of.events = clcf->open_file_cache_events; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
337 of.directio = NGX_OPEN_FILE_DIRECTIO_OFF; |
3178 | 338 of.read_ahead = clcf->read_ahead; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
339 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
340 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
|
341 != NGX_OK) |
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 switch (of.err) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
344 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
345 case 0: |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
346 return NGX_ERROR; |
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 case NGX_ENOENT: |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
349 case NGX_ENOTDIR: |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
350 goto done; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
351 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
352 default: |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
353 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
|
354 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
|
355 return NGX_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
356 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
357 } |
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 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
|
360 "http file cache fd: %d", of.fd); |
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 c->file.fd = of.fd; |
2603
f9bd7999eb08
fix segfault if ngx_read_file() will fail
Igor Sysoev <igor@sysoev.ru>
parents:
2600
diff
changeset
|
363 c->file.log = r->connection->log; |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
364 c->uniq = of.uniq; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
365 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
|
366 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
|
367 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
368 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
|
369 if (c->buf == NULL) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
370 return NGX_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
371 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
372 |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
373 return ngx_http_file_cache_read(r, c); |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
374 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
375 done: |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
376 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
377 if (rv == NGX_DECLINED) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
378 return ngx_http_file_cache_lock(r, c); |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
379 } |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
380 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
381 return rv; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
382 } |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
383 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
384 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
385 static ngx_int_t |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
386 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
|
387 { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
388 ngx_msec_t now, timer; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
389 ngx_http_file_cache_t *cache; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
390 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
391 if (!c->lock) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
392 return NGX_DECLINED; |
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 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
395 cache = c->file_cache; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
396 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
397 ngx_shmtx_lock(&cache->shpool->mutex); |
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 if (!c->node->updating) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
400 c->node->updating = 1; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
401 c->updating = 1; |
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 ngx_shmtx_unlock(&cache->shpool->mutex); |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
405 |
4387
e8181eeddaf8
Fixed build without debug.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4385
diff
changeset
|
406 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
|
407 "http file cache lock u:%d wt:%M", |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
408 c->updating, c->wait_time); |
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->updating) { |
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 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
414 c->waiting = 1; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
415 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
416 now = ngx_current_msec; |
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 if (c->wait_time == 0) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
419 c->wait_time = now + c->lock_timeout; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
420 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
421 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
|
422 c->wait_event.data = r; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
423 c->wait_event.log = r->connection->log; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
424 } |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
425 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
426 timer = c->wait_time - now; |
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 ngx_add_timer(&c->wait_event, (timer > 500) ? 500 : timer); |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
429 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
430 r->main->blocked++; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
431 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
432 return NGX_AGAIN; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
433 } |
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 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
436 static void |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
437 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
|
438 { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
439 ngx_uint_t wait; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
440 ngx_msec_t timer; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
441 ngx_http_cache_t *c; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
442 ngx_http_request_t *r; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
443 ngx_http_file_cache_t *cache; |
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 r = ev->data; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
446 c = r->cache; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
447 |
4387
e8181eeddaf8
Fixed build without debug.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4385
diff
changeset
|
448 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0, |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
449 "http file cache wait handler wt:%M cur:%M", |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
450 c->wait_time, ngx_current_msec); |
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 timer = c->wait_time - ngx_current_msec; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
453 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
454 if ((ngx_msec_int_t) timer <= 0) { |
5341
654c1631dc86
Cache: lock timeouts are now logged at info level.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5330
diff
changeset
|
455 ngx_log_error(NGX_LOG_INFO, ev->log, 0, "cache lock timeout"); |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
456 c->lock = 0; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
457 goto wakeup; |
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 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
460 cache = c->file_cache; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
461 wait = 0; |
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 ngx_shmtx_lock(&cache->shpool->mutex); |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
464 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
465 if (c->node->updating) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
466 wait = 1; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
467 } |
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 ngx_shmtx_unlock(&cache->shpool->mutex); |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
470 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
471 if (wait) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
472 ngx_add_timer(ev, (timer > 500) ? 500 : timer); |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
473 return; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
474 } |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
475 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
476 wakeup: |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
477 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
478 c->waiting = 0; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
479 r->main->blocked--; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
480 r->connection->write->handler(r->connection->write); |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
481 } |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
482 |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
483 |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
484 static ngx_int_t |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
485 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
|
486 { |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
487 time_t now; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
488 ssize_t n; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
489 ngx_int_t rc; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
490 ngx_http_file_cache_t *cache; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
491 ngx_http_file_cache_header_t *h; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
492 |
3294
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
493 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
|
494 |
3294
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
495 if (n < 0) { |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
496 return n; |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
497 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
498 |
3369
479468a7d982
fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents:
3294
diff
changeset
|
499 if ((size_t) n < c->header_start) { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
500 ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0, |
477 | 501 "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
|
502 return NGX_DECLINED; |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
503 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
504 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
505 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
|
506 |
5736
2fe1967f8854
Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5726
diff
changeset
|
507 if (h->version != NGX_HTTP_CACHE_VERSION) { |
2fe1967f8854
Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5726
diff
changeset
|
508 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
|
509 "cache file \"%s\" version mismatch", c->file.name.data); |
2fe1967f8854
Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5726
diff
changeset
|
510 return NGX_DECLINED; |
2fe1967f8854
Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5726
diff
changeset
|
511 } |
2fe1967f8854
Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5726
diff
changeset
|
512 |
3460
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3400
diff
changeset
|
513 if (h->crc32 != c->crc32) { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
514 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
|
515 "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
|
516 return NGX_DECLINED; |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
517 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
518 |
5359
2fda9065d0f4
Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5341
diff
changeset
|
519 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
|
520 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
|
521 "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
|
522 c->file.name.data); |
6f97afc238de
Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4338
diff
changeset
|
523 return NGX_DECLINED; |
6f97afc238de
Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4338
diff
changeset
|
524 } |
6f97afc238de
Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4338
diff
changeset
|
525 |
5878
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
526 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
|
527 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
|
528 "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
|
529 c->file.name.data); |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
530 return NGX_DECLINED; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
531 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
532 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
533 if (h->vary_len) { |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
534 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
|
535 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
536 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
|
537 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
|
538 "http file cache vary mismatch"); |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
539 return NGX_DECLINED; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
540 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
541 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
542 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
543 c->buf->last += n; |
477 | 544 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
545 c->valid_sec = h->valid_sec; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
546 c->last_modified = h->last_modified; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
547 c->date = h->date; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
548 c->valid_msec = h->valid_msec; |
3460
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3400
diff
changeset
|
549 c->header_start = h->header_start; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
550 c->body_start = h->body_start; |
5737
44b9ab7752e3
Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5736
diff
changeset
|
551 c->etag.len = h->etag_len; |
44b9ab7752e3
Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5736
diff
changeset
|
552 c->etag.data = h->etag; |
477 | 553 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
554 r->cached = 1; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
555 |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
556 cache = c->file_cache; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
557 |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
558 if (cache->sh->cold) { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
559 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
560 ngx_shmtx_lock(&cache->shpool->mutex); |
477 | 561 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
562 if (!c->node->exists) { |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
563 c->node->uses = 1; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
564 c->node->body_start = c->body_start; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
565 c->node->exists = 1; |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
566 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
|
567 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
|
568 |
3899
e7cd13b7f759
Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents:
3885
diff
changeset
|
569 cache->sh->size += c->fs_size; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
570 } |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
571 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
572 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
|
573 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
574 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
575 now = ngx_time(); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
576 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
577 if (c->valid_sec < now) { |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
578 |
2927
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
579 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
|
580 |
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
581 if (c->node->updating) { |
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
582 rc = NGX_HTTP_CACHE_UPDATING; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
583 |
2927
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
584 } else { |
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
585 c->node->updating = 1; |
3711
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
586 c->updating = 1; |
2927
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
587 rc = NGX_HTTP_CACHE_STALE; |
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
588 } |
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
589 |
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
590 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
|
591 |
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
592 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
|
593 "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
|
594 rc, c->valid_sec, now); |
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
595 |
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
596 return rc; |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
597 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
598 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
599 return NGX_OK; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
600 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
601 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
602 |
3294
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
603 static ssize_t |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
604 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
|
605 { |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
606 #if (NGX_HAVE_FILE_AIO) |
3294
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
607 ssize_t n; |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
608 ngx_http_core_loc_conf_t *clcf; |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
609 |
3294
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
610 if (!ngx_file_aio) { |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
611 goto noaio; |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
612 } |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
613 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
614 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
615 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
616 if (!clcf->aio) { |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
617 goto noaio; |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
618 } |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
619 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
620 n = ngx_file_aio_read(&c->file, c->buf->pos, c->body_start, 0, r->pool); |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
621 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
622 if (n != NGX_AGAIN) { |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
623 return n; |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
624 } |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
625 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
626 c->file.aio->data = r; |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
627 c->file.aio->handler = ngx_http_cache_aio_event_handler; |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
628 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
629 r->main->blocked++; |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
630 r->aio = 1; |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
631 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
632 return NGX_AGAIN; |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
633 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
634 noaio: |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
635 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
636 #endif |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
637 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
638 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
|
639 } |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
640 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
641 |
04cfc09b8b8d
export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents:
3195
diff
changeset
|
642 #if (NGX_HAVE_FILE_AIO) |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
643 |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
644 static void |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
645 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
|
646 { |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
647 ngx_event_aio_t *aio; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
648 ngx_http_request_t *r; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
649 |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
650 aio = ev->data; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
651 r = aio->data; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
652 |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
653 r->main->blocked--; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
654 r->aio = 0; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
655 |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
656 r->connection->write->handler(r->connection->write); |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
657 } |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
658 |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
659 #endif |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
660 |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3024
diff
changeset
|
661 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
662 static ngx_int_t |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
663 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
|
664 { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
665 ngx_int_t rc; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
666 ngx_http_file_cache_node_t *fcn; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
667 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
668 ngx_shmtx_lock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
669 |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
670 fcn = c->node; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
671 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
672 if (fcn == NULL) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
673 fcn = ngx_http_file_cache_lookup(cache, c->key); |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
674 } |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
675 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
676 if (fcn) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
677 ngx_queue_remove(&fcn->queue); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
678 |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
679 if (c->node == NULL) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
680 fcn->uses++; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
681 fcn->count++; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
682 } |
3724
e9f0a2497d3c
count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents:
3723
diff
changeset
|
683 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
684 if (fcn->error) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
685 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
686 if (fcn->valid_sec < ngx_time()) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
687 goto renew; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
688 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
689 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
690 rc = NGX_OK; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
691 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
692 goto done; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
693 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
694 |
3966
9c425f22ea36
fuse two if's in one condition
Igor Sysoev <igor@sysoev.ru>
parents:
3965
diff
changeset
|
695 if (fcn->exists || fcn->uses >= c->min_uses) { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
696 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
697 c->exists = fcn->exists; |
3969 | 698 if (fcn->body_start) { |
3967
83e41f6f6d96
The cache loader performs two tasks: inserting cache objects in inactivity
Igor Sysoev <igor@sysoev.ru>
parents:
3966
diff
changeset
|
699 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
|
700 } |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
701 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
702 rc = NGX_OK; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
703 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
704 goto done; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
705 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
706 |
3966
9c425f22ea36
fuse two if's in one condition
Igor Sysoev <igor@sysoev.ru>
parents:
3965
diff
changeset
|
707 rc = NGX_AGAIN; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
708 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
709 goto done; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
710 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
711 |
5726
25ade23cf281
Core: added ngx_slab_calloc() and ngx_slab_calloc_locked().
Ruslan Ermilov <ru@nginx.com>
parents:
5679
diff
changeset
|
712 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
|
713 sizeof(ngx_http_file_cache_node_t)); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
714 if (fcn == NULL) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
715 ngx_shmtx_unlock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
716 |
2693 | 717 (void) ngx_http_file_cache_forced_expire(cache); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
718 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
719 ngx_shmtx_lock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
720 |
5726
25ade23cf281
Core: added ngx_slab_calloc() and ngx_slab_calloc_locked().
Ruslan Ermilov <ru@nginx.com>
parents:
5679
diff
changeset
|
721 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
|
722 sizeof(ngx_http_file_cache_node_t)); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
723 if (fcn == NULL) { |
5822
063f7e75f9ef
Upstream: suppressed the file cache slab allocator error messages.
Roman Arutyunyan <arut@nginx.com>
parents:
5737
diff
changeset
|
724 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
|
725 "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
|
726 rc = NGX_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
727 goto failed; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
728 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
729 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
730 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
731 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
|
732 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
733 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
|
734 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
|
735 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
736 ngx_rbtree_insert(&cache->sh->rbtree, &fcn->node); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
737 |
3724
e9f0a2497d3c
count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents:
3723
diff
changeset
|
738 fcn->uses = 1; |
e9f0a2497d3c
count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents:
3723
diff
changeset
|
739 fcn->count = 1; |
e9f0a2497d3c
count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents:
3723
diff
changeset
|
740 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
741 renew: |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
742 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
743 rc = NGX_DECLINED; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
744 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
745 fcn->valid_msec = 0; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
746 fcn->error = 0; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
747 fcn->exists = 0; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
748 fcn->valid_sec = 0; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
749 fcn->uniq = 0; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
750 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
|
751 fcn->fs_size = 0; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
752 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
753 done: |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
754 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
755 fcn->expire = ngx_time() + cache->inactive; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
756 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
757 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
|
758 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
759 c->uniq = fcn->uniq; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
760 c->error = fcn->error; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
761 c->node = fcn; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
762 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
763 failed: |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
764 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
765 ngx_shmtx_unlock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
766 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
767 return rc; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
768 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
769 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
770 |
3696 | 771 static ngx_int_t |
772 ngx_http_file_cache_name(ngx_http_request_t *r, ngx_path_t *path) | |
773 { | |
774 u_char *p; | |
775 ngx_http_cache_t *c; | |
776 | |
777 c = r->cache; | |
778 | |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
779 if (c->file.name.len) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
780 return NGX_OK; |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
781 } |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
782 |
3696 | 783 c->file.name.len = path->name.len + 1 + path->len |
784 + 2 * NGX_HTTP_CACHE_KEY_LEN; | |
785 | |
786 c->file.name.data = ngx_pnalloc(r->pool, c->file.name.len + 1); | |
787 if (c->file.name.data == NULL) { | |
788 return NGX_ERROR; | |
789 } | |
790 | |
791 ngx_memcpy(c->file.name.data, path->name.data, path->name.len); | |
792 | |
793 p = c->file.name.data + path->name.len + 1 + path->len; | |
794 p = ngx_hex_dump(p, c->key, NGX_HTTP_CACHE_KEY_LEN); | |
795 *p = '\0'; | |
796 | |
797 ngx_create_hashed_filename(path, c->file.name.data, c->file.name.len); | |
798 | |
799 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
800 "cache file: \"%s\"", c->file.name.data); | |
801 | |
802 return NGX_OK; | |
803 } | |
804 | |
805 | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
806 static ngx_http_file_cache_node_t * |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
807 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
|
808 { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
809 ngx_int_t rc; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
810 ngx_rbtree_key_t node_key; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
811 ngx_rbtree_node_t *node, *sentinel; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
812 ngx_http_file_cache_node_t *fcn; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
813 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
814 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
|
815 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
816 node = cache->sh->rbtree.root; |
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
817 sentinel = cache->sh->rbtree.sentinel; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
818 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
819 while (node != sentinel) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
820 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
821 if (node_key < node->key) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
822 node = node->left; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
823 continue; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
824 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
825 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
826 if (node_key > node->key) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
827 node = node->right; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
828 continue; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
829 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
830 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
831 /* node_key == node->key */ |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
832 |
4497
95ab6658654a
Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4474
diff
changeset
|
833 fcn = (ngx_http_file_cache_node_t *) node; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
834 |
4497
95ab6658654a
Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4474
diff
changeset
|
835 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
|
836 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
|
837 |
4497
95ab6658654a
Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4474
diff
changeset
|
838 if (rc == 0) { |
95ab6658654a
Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4474
diff
changeset
|
839 return fcn; |
95ab6658654a
Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4474
diff
changeset
|
840 } |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
841 |
4497
95ab6658654a
Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4474
diff
changeset
|
842 node = (rc < 0) ? node->left : node->right; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
843 } |
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 /* not found */ |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
846 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
847 return NULL; |
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 |
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 static void |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
852 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
|
853 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
|
854 { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
855 ngx_rbtree_node_t **p; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
856 ngx_http_file_cache_node_t *cn, *cnt; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
857 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
858 for ( ;; ) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
859 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
860 if (node->key < temp->key) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
861 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
862 p = &temp->left; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
863 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
864 } else if (node->key > temp->key) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
865 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
866 p = &temp->right; |
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 } else { /* node->key == temp->key */ |
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 cn = (ngx_http_file_cache_node_t *) node; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
871 cnt = (ngx_http_file_cache_node_t *) temp; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
872 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
873 p = (ngx_memcmp(cn->key, cnt->key, |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
874 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
|
875 < 0) |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
876 ? &temp->left : &temp->right; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
877 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
878 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
879 if (*p == sentinel) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
880 break; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
881 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
882 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
883 temp = *p; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
884 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
885 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
886 *p = node; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
887 node->parent = temp; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
888 node->left = sentinel; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
889 node->right = sentinel; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
890 ngx_rbt_red(node); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
891 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
892 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
893 |
5878
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
894 static void |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
895 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
|
896 u_char *hash) |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
897 { |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
898 u_char *p, *last; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
899 ngx_str_t name; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
900 ngx_md5_t md5; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
901 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
|
902 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
903 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
|
904 "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
|
905 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
906 ngx_md5_init(&md5); |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
907 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
908 ngx_strlow(buf, vary, len); |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
909 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
910 p = buf; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
911 last = buf + len; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
912 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
913 while (p < last) { |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
914 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
915 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
|
916 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
917 name.data = p; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
918 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
919 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
|
920 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
921 name.len = p - name.data; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
922 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
923 if (name.len == 0) { |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
924 break; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
925 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
926 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
927 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
|
928 "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
|
929 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
930 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
|
931 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
|
932 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
933 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
|
934 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
935 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
|
936 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
937 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
938 ngx_md5_final(hash, &md5); |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
939 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
940 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
941 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
942 static void |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
943 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
|
944 ngx_str_t *name) |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
945 { |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
946 ngx_uint_t i; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
947 ngx_list_part_t *part; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
948 ngx_table_elt_t *header; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
949 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
950 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
|
951 header = part->elts; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
952 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
953 for (i = 0; /* void */ ; i++) { |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
954 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
955 if (i >= part->nelts) { |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
956 if (part->next == NULL) { |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
957 break; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
958 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
959 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
960 part = part->next; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
961 header = part->elts; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
962 i = 0; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
963 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
964 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
965 if (header[i].hash == 0) { |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
966 continue; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
967 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
968 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
969 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
|
970 continue; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
971 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
972 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
973 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
|
974 continue; |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
975 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
976 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
977 ngx_md5_update(md5, header[i].value.data, header[i].value.len); |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
978 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
979 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
980 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
981 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
982 void |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
983 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
|
984 { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
985 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
|
986 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
987 u_char *p; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
988 ngx_str_t *key; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
989 ngx_uint_t i; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
990 ngx_http_cache_t *c; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
991 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
992 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
|
993 "http file cache set header"); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
994 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
995 c = r->cache; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
996 |
5245
711fa02afae8
Valgrind: supressed complaints about uninitialized bytes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5077
diff
changeset
|
997 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
|
998 |
5736
2fe1967f8854
Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5726
diff
changeset
|
999 h->version = NGX_HTTP_CACHE_VERSION; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1000 h->valid_sec = c->valid_sec; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1001 h->last_modified = c->last_modified; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1002 h->date = c->date; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1003 h->crc32 = c->crc32; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1004 h->valid_msec = (u_short) c->valid_msec; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1005 h->header_start = (u_short) c->header_start; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1006 h->body_start = (u_short) c->body_start; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1007 |
5737
44b9ab7752e3
Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5736
diff
changeset
|
1008 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
|
1009 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
|
1010 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
|
1011 } |
44b9ab7752e3
Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5736
diff
changeset
|
1012 |
5878
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1013 if (c->vary.len) { |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1014 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
|
1015 /* should not happen */ |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1016 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
|
1017 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1018 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1019 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
|
1020 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
|
1021 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1022 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
|
1023 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
|
1024 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1025 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1026 p = buf + sizeof(ngx_http_file_cache_header_t); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1027 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1028 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
|
1029 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1030 key = c->keys.elts; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1031 for (i = 0; i < c->keys.nelts; i++) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1032 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
|
1033 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1034 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1035 *p = LF; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1036 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1037 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1038 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1039 void |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1040 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
|
1041 { |
3899
e7cd13b7f759
Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents:
3885
diff
changeset
|
1042 off_t fs_size; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1043 ngx_int_t rc; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1044 ngx_file_uniq_t uniq; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1045 ngx_file_info_t fi; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1046 ngx_http_cache_t *c; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1047 ngx_ext_rename_file_t ext; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1048 ngx_http_file_cache_t *cache; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1049 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1050 c = r->cache; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1051 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1052 if (c->updated) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1053 return; |
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 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
|
1057 "http file cache update"); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1058 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1059 c->updated = 1; |
3711
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1060 c->updating = 0; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1061 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1062 cache = c->file_cache; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1063 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1064 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
|
1065 fs_size = 0; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1066 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1067 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
|
1068 "http file cache rename: \"%s\" to \"%s\"", |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1069 tf->file.name.data, c->file.name.data); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1070 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1071 ext.access = NGX_FILE_OWNER_ACCESS; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1072 ext.path_access = NGX_FILE_OWNER_ACCESS; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1073 ext.time = -1; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1074 ext.create_path = 1; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1075 ext.delete_file = 1; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1076 ext.log = r->connection->log; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1077 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1078 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
|
1079 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1080 if (rc == NGX_OK) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1081 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1082 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
|
1083 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
|
1084 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
|
1085 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1086 rc = NGX_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1087 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1088 } else { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1089 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
|
1090 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
|
1091 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1092 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1093 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1094 ngx_shmtx_lock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1095 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1096 c->node->count--; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1097 c->node->uniq = uniq; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1098 c->node->body_start = c->body_start; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1099 |
3899
e7cd13b7f759
Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents:
3885
diff
changeset
|
1100 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
|
1101 c->node->fs_size = fs_size; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1102 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1103 if (rc == NGX_OK) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1104 c->node->exists = 1; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1105 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1106 |
2927
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
1107 c->node->updating = 0; |
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2926
diff
changeset
|
1108 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1109 ngx_shmtx_unlock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1110 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1111 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1112 |
5441
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1113 void |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1114 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
|
1115 { |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1116 ssize_t n; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1117 ngx_err_t err; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1118 ngx_file_t file; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1119 ngx_file_info_t fi; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1120 ngx_http_cache_t *c; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1121 ngx_http_file_cache_header_t h; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1122 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1123 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
|
1124 "http file cache update header"); |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1125 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1126 c = r->cache; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1127 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1128 ngx_memzero(&file, sizeof(ngx_file_t)); |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1129 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1130 file.name = c->file.name; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1131 file.log = r->connection->log; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1132 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
|
1133 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1134 if (file.fd == NGX_INVALID_FILE) { |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1135 err = ngx_errno; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1136 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1137 /* cache file may have been deleted */ |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1138 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1139 if (err == NGX_ENOENT) { |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1140 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
|
1141 "http file cache \"%s\" not found", |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1142 file.name.data); |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1143 return; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1144 } |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1145 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1146 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
|
1147 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
|
1148 return; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1149 } |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1150 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1151 /* |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1152 * make sure cache file wasn't replaced; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1153 * if it was, do nothing |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1154 */ |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1155 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1156 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
|
1157 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
|
1158 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
|
1159 goto done; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1160 } |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1161 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1162 if (c->uniq != ngx_file_uniq(&fi) |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1163 || c->length != ngx_file_size(&fi)) |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1164 { |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1165 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
|
1166 "http file cache \"%s\" changed", |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1167 file.name.data); |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1168 goto done; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1169 } |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1170 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1171 n = ngx_read_file(&file, (u_char *) &h, |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1172 sizeof(ngx_http_file_cache_header_t), 0); |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1173 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1174 if (n == NGX_ERROR) { |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1175 goto done; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1176 } |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1177 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1178 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
|
1179 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
|
1180 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
|
1181 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
|
1182 goto done; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1183 } |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1184 |
5736
2fe1967f8854
Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5726
diff
changeset
|
1185 if (h.version != NGX_HTTP_CACHE_VERSION |
2fe1967f8854
Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5726
diff
changeset
|
1186 || h.last_modified != c->last_modified |
5441
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1187 || h.crc32 != c->crc32 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1188 || h.header_start != c->header_start |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1189 || h.body_start != c->body_start) |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1190 { |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1191 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
|
1192 "http file cache \"%s\" content changed", |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1193 file.name.data); |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1194 goto done; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1195 } |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1196 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1197 /* |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1198 * update cache file header with new data, |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1199 * notably h.valid_sec and h.date |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1200 */ |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1201 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1202 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
|
1203 |
5736
2fe1967f8854
Cache: version in cache files.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5726
diff
changeset
|
1204 h.version = NGX_HTTP_CACHE_VERSION; |
5441
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1205 h.valid_sec = c->valid_sec; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1206 h.last_modified = c->last_modified; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1207 h.date = c->date; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1208 h.crc32 = c->crc32; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1209 h.valid_msec = (u_short) c->valid_msec; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1210 h.header_start = (u_short) c->header_start; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1211 h.body_start = (u_short) c->body_start; |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1212 |
5737
44b9ab7752e3
Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5736
diff
changeset
|
1213 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
|
1214 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
|
1215 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
|
1216 } |
44b9ab7752e3
Cache: ETag now saved into cache header.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5736
diff
changeset
|
1217 |
5878
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1218 if (c->vary.len) { |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1219 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
|
1220 /* should not happen */ |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1221 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
|
1222 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1223 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1224 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
|
1225 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
|
1226 |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1227 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
|
1228 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
|
1229 } |
2c89956b6a76
Cache: hash of Vary headers now stored in cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5822
diff
changeset
|
1230 |
5441
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1231 (void) ngx_write_file(&file, (u_char *) &h, |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1232 sizeof(ngx_http_file_cache_header_t), 0); |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1233 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1234 done: |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1235 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1236 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
|
1237 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
|
1238 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
|
1239 } |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1240 } |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1241 |
43ccaf8e8728
Upstream: cache revalidation with conditional requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5359
diff
changeset
|
1242 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1243 ngx_int_t |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1244 ngx_http_cache_send(ngx_http_request_t *r) |
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_int_t rc; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1247 ngx_buf_t *b; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1248 ngx_chain_t out; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1249 ngx_http_cache_t *c; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1250 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1251 c = r->cache; |
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_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
3965 | 1254 "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
|
1255 |
4150
b9ee14871bf1
Cache: fix for sending of empty responses.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4034
diff
changeset
|
1256 if (r != r->main && c->length - c->body_start == 0) { |
b9ee14871bf1
Cache: fix for sending of empty responses.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4034
diff
changeset
|
1257 return ngx_http_send_header(r); |
b9ee14871bf1
Cache: fix for sending of empty responses.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4034
diff
changeset
|
1258 } |
b9ee14871bf1
Cache: fix for sending of empty responses.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4034
diff
changeset
|
1259 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1260 /* 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
|
1261 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1262 b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1263 if (b == NULL) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1264 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1265 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1266 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1267 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
|
1268 if (b->file == NULL) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1269 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1270 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1271 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1272 rc = ngx_http_send_header(r); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1273 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1274 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
|
1275 return rc; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1276 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1277 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1278 b->file_pos = c->body_start; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1279 b->file_last = c->length; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1280 |
4150
b9ee14871bf1
Cache: fix for sending of empty responses.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4034
diff
changeset
|
1281 b->in_file = (c->length - c->body_start) ? 1: 0; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1282 b->last_buf = (r == r->main) ? 1: 0; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1283 b->last_in_chain = 1; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1284 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1285 b->file->fd = c->file.fd; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1286 b->file->name = c->file.name; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1287 b->file->log = r->connection->log; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1288 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1289 out.buf = b; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1290 out.next = NULL; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1291 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1292 return ngx_http_output_filter(r, &out); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1293 } |
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 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1296 void |
3711
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1297 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
|
1298 { |
3694
dfb17155eca9
delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
1299 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
|
1300 ngx_http_file_cache_node_t *fcn; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1301 |
3917
2a70484a6580
fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents:
3899
diff
changeset
|
1302 if (c->updated || c->node == NULL) { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1303 return; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1304 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1305 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1306 cache = c->file_cache; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1307 |
3713
f0b62d1ac7af
move debug logging inside ngx_http_file_cache_free()
Igor Sysoev <igor@sysoev.ru>
parents:
3711
diff
changeset
|
1308 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
|
1309 "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
|
1310 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1311 ngx_shmtx_lock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1312 |
3694
dfb17155eca9
delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
1313 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
|
1314 fcn->count--; |
3711
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1315 |
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1316 if (c->updating) { |
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1317 fcn->updating = 0; |
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1318 } |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1319 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1320 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
|
1321 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
|
1322 |
3743
c469ffeab569
error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents:
3732
diff
changeset
|
1323 if (c->valid_sec) { |
c469ffeab569
error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents:
3732
diff
changeset
|
1324 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
|
1325 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
|
1326 } |
c469ffeab569
error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents:
3732
diff
changeset
|
1327 |
3723
14ad3210fc73
do not free unused cache node if cache min_uses > 1,
Igor Sysoev <igor@sysoev.ru>
parents:
3713
diff
changeset
|
1328 } 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
|
1329 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
|
1330 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
|
1331 ngx_slab_free_locked(cache->shpool, fcn); |
dfb17155eca9
delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
1332 c->node = NULL; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1333 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1334 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1335 ngx_shmtx_unlock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1336 |
3711
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1337 c->updated = 1; |
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1338 c->updating = 0; |
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1339 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1340 if (c->temp_file) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1341 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
|
1342 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
|
1343 "http file cache incomplete: \"%s\"", |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1344 tf->file.name.data); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1345 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1346 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
|
1347 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
|
1348 ngx_delete_file_n " \"%s\" failed", |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1349 tf->file.name.data); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1350 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1351 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1352 } |
4385
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
1353 |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
1354 if (c->wait_event.timer_set) { |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
1355 ngx_del_timer(&c->wait_event); |
70ba81827472
Cache locks initial implementation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4340
diff
changeset
|
1356 } |
2592
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 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1359 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1360 static void |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1361 ngx_http_file_cache_cleanup(void *data) |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1362 { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1363 ngx_http_cache_t *c = data; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1364 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1365 if (c->updated) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1366 return; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1367 } |
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 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
|
1370 "http file cache cleanup"); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1371 |
3711
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1372 if (c->updating) { |
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1373 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
|
1374 "stalled cache updating, error:%ui", c->error); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1375 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1376 |
3711
ce6ba077c270
several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents:
3710
diff
changeset
|
1377 ngx_http_file_cache_free(c, NULL); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1378 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1379 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1380 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1381 static time_t |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1382 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
|
1383 { |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1384 u_char *name; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1385 size_t len; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1386 time_t wait; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1387 ngx_uint_t tries; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1388 ngx_path_t *path; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1389 ngx_queue_t *q; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1390 ngx_http_file_cache_node_t *fcn; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1391 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1392 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
|
1393 "http file cache forced expire"); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1394 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1395 path = cache->path; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1396 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
|
1397 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1398 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
|
1399 if (name == NULL) { |
2694
49a1382b249b
set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents:
2693
diff
changeset
|
1400 return 10; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1401 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1402 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1403 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
|
1404 |
2694
49a1382b249b
set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents:
2693
diff
changeset
|
1405 wait = 10; |
3728 | 1406 tries = 20; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1407 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1408 ngx_shmtx_lock(&cache->shpool->mutex); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1409 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
1410 for (q = ngx_queue_last(&cache->sh->queue); |
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
1411 q != ngx_queue_sentinel(&cache->sh->queue); |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1412 q = ngx_queue_prev(q)) |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1413 { |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1414 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
|
1415 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1416 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
|
1417 "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
|
1418 fcn->count, fcn->exists, |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1419 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
|
1420 |
3727 | 1421 if (fcn->count == 0) { |
1422 ngx_http_file_cache_delete(cache, q, name); | |
3885 | 1423 wait = 0; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1424 |
3727 | 1425 } else { |
3728 | 1426 if (--tries) { |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1427 continue; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1428 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1429 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1430 wait = 1; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1431 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1432 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1433 break; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1434 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1435 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1436 ngx_shmtx_unlock(&cache->shpool->mutex); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1437 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1438 ngx_free(name); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1439 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1440 return wait; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1441 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1442 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1443 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1444 static time_t |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1445 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
|
1446 { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1447 u_char *name, *p; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1448 size_t len; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1449 time_t now, wait; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1450 ngx_path_t *path; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1451 ngx_queue_t *q; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1452 ngx_http_file_cache_node_t *fcn; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1453 u_char key[2 * NGX_HTTP_CACHE_KEY_LEN]; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1454 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1455 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
|
1456 "http file cache expire"); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1457 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1458 path = cache->path; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1459 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
|
1460 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1461 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
|
1462 if (name == NULL) { |
2694
49a1382b249b
set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents:
2693
diff
changeset
|
1463 return 10; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1464 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1465 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1466 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
|
1467 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1468 now = ngx_time(); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1469 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1470 ngx_shmtx_lock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1471 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1472 for ( ;; ) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1473 |
5679
5748ce74c1cc
Cache: added ngx_quit check to ngx_http_file_cache_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents:
5441
diff
changeset
|
1474 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
|
1475 wait = 1; |
5748ce74c1cc
Cache: added ngx_quit check to ngx_http_file_cache_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents:
5441
diff
changeset
|
1476 break; |
5748ce74c1cc
Cache: added ngx_quit check to ngx_http_file_cache_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents:
5441
diff
changeset
|
1477 } |
5748ce74c1cc
Cache: added ngx_quit check to ngx_http_file_cache_expire().
Maxim Dounin <mdounin@mdounin.ru>
parents:
5441
diff
changeset
|
1478 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
1479 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
|
1480 wait = 10; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1481 break; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1482 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1483 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
1484 q = ngx_queue_last(&cache->sh->queue); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1485 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1486 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
|
1487 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1488 wait = fcn->expire - now; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1489 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1490 if (wait > 0) { |
2694
49a1382b249b
set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents:
2693
diff
changeset
|
1491 wait = wait > 10 ? 10 : wait; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1492 break; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1493 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1494 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1495 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
|
1496 "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
|
1497 fcn->count, fcn->exists, |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1498 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
|
1499 |
3727 | 1500 if (fcn->count == 0) { |
1501 ngx_http_file_cache_delete(cache, q, name); | |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1502 continue; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1503 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1504 |
3755
76e3a93821b1
fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents:
3744
diff
changeset
|
1505 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
|
1506 wait = 1; |
2e8dbd773d63
fix r3756: release lock to allow other process to delete cache node
Igor Sysoev <igor@sysoev.ru>
parents:
3917
diff
changeset
|
1507 break; |
3755
76e3a93821b1
fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents:
3744
diff
changeset
|
1508 } |
76e3a93821b1
fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents:
3744
diff
changeset
|
1509 |
3727 | 1510 p = ngx_hex_dump(key, (u_char *) &fcn->node.key, |
1511 sizeof(ngx_rbtree_key_t)); | |
1512 len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t); | |
1513 (void) ngx_hex_dump(p, fcn->key, len); | |
1514 | |
1515 /* | |
1516 * abnormally exited workers may leave locked cache entries, | |
1517 * 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
|
1518 * we prefer to just move them to the top of the inactive queue |
3727 | 1519 */ |
1520 | |
1521 ngx_queue_remove(q); | |
4340
4533d7684e14
Cache: only complain on long locked entries.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4339
diff
changeset
|
1522 fcn->expire = ngx_time() + cache->inactive; |
4533d7684e14
Cache: only complain on long locked entries.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4339
diff
changeset
|
1523 ngx_queue_insert_head(&cache->sh->queue, &fcn->queue); |
3727 | 1524 |
1525 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, | |
1526 "ignore long locked inactive cache entry %*s, count:%d", | |
1527 2 * NGX_HTTP_CACHE_KEY_LEN, key, fcn->count); | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1528 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1529 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1530 ngx_shmtx_unlock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1531 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1532 ngx_free(name); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1533 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1534 return wait; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1535 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1536 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1537 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1538 static void |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1539 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
|
1540 u_char *name) |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1541 { |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1542 u_char *p; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1543 size_t len; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1544 ngx_path_t *path; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1545 ngx_http_file_cache_node_t *fcn; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1546 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1547 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
|
1548 |
3726
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1549 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
|
1550 cache->sh->size -= fcn->fs_size; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1551 |
3726
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1552 path = cache->path; |
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1553 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
|
1554 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
|
1555 sizeof(ngx_rbtree_key_t)); |
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1556 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
|
1557 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
|
1558 *p = '\0'; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1559 |
3726
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1560 fcn->count++; |
3755
76e3a93821b1
fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents:
3744
diff
changeset
|
1561 fcn->deleting = 1; |
3726
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1562 ngx_shmtx_unlock(&cache->shpool->mutex); |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1563 |
3726
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1564 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
|
1565 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
|
1566 |
3726
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1567 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
|
1568 "http file cache expire: \"%s\"", name); |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1569 |
3726
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1570 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
|
1571 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
|
1572 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
|
1573 } |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1574 |
3726
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1575 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
|
1576 fcn->count--; |
3755
76e3a93821b1
fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents:
3744
diff
changeset
|
1577 fcn->deleting = 0; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1578 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1579 |
3726
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1580 if (fcn->count == 0) { |
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1581 ngx_queue_remove(q); |
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1582 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
|
1583 ngx_slab_free_locked(cache->shpool, fcn); |
282ddd49f925
*) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents:
3724
diff
changeset
|
1584 } |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1585 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1586 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1587 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1588 static time_t |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1589 ngx_http_file_cache_manager(void *data) |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1590 { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1591 ngx_http_file_cache_t *cache = data; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1592 |
3018 | 1593 off_t size; |
3885 | 1594 time_t next, wait; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1595 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1596 next = ngx_http_file_cache_expire(cache); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1597 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1598 cache->last = ngx_current_msec; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1599 cache->files = 0; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1600 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1601 for ( ;; ) { |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1602 ngx_shmtx_lock(&cache->shpool->mutex); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1603 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
1604 size = cache->sh->size; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1605 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1606 ngx_shmtx_unlock(&cache->shpool->mutex); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1607 |
2631 | 1608 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, |
1609 "http file cache size: %O", size); | |
1610 | |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1611 if (size < cache->max_size) { |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1612 return next; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1613 } |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1614 |
3885 | 1615 wait = ngx_http_file_cache_forced_expire(cache); |
1616 | |
1617 if (wait > 0) { | |
1618 return wait; | |
1619 } | |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1620 |
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
|
1621 if (ngx_quit || ngx_terminate) { |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1622 return next; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1623 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1624 } |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1625 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1626 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1627 |
3018 | 1628 static void |
1629 ngx_http_file_cache_loader(void *data) | |
1630 { | |
1631 ngx_http_file_cache_t *cache = data; | |
1632 | |
1633 ngx_tree_ctx_t tree; | |
1634 | |
1635 if (!cache->sh->cold || cache->sh->loading) { | |
1636 return; | |
1637 } | |
1638 | |
1639 if (!ngx_atomic_cmp_set(&cache->sh->loading, 0, ngx_pid)) { | |
1640 return; | |
1641 } | |
1642 | |
1643 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, | |
1644 "http file cache loader"); | |
1645 | |
1646 tree.init_handler = NULL; | |
1647 tree.file_handler = ngx_http_file_cache_manage_file; | |
1648 tree.pre_tree_handler = ngx_http_file_cache_noop; | |
1649 tree.post_tree_handler = ngx_http_file_cache_noop; | |
1650 tree.spec_handler = ngx_http_file_cache_delete_file; | |
1651 tree.data = cache; | |
1652 tree.alloc = 0; | |
1653 tree.log = ngx_cycle->log; | |
1654 | |
1655 cache->last = ngx_current_msec; | |
1656 cache->files = 0; | |
1657 | |
1658 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
|
1659 cache->sh->loading = 0; |
3018 | 1660 return; |
1661 } | |
1662 | |
1663 cache->sh->cold = 0; | |
1664 cache->sh->loading = 0; | |
1665 | |
1666 ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, | |
1667 "http file cache: %V %.3fM, bsize: %uz", | |
1668 &cache->path->name, | |
1669 ((double) cache->sh->size * cache->bsize) / (1024 * 1024), | |
1670 cache->bsize); | |
1671 } | |
1672 | |
1673 | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1674 static ngx_int_t |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1675 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
|
1676 { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1677 return NGX_OK; |
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 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1681 static ngx_int_t |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1682 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
|
1683 { |
4018
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1684 ngx_msec_t elapsed; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1685 ngx_http_file_cache_t *cache; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1686 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1687 cache = ctx->data; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1688 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1689 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
|
1690 (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
|
1691 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1692 |
4018
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1693 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
|
1694 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
|
1695 |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1696 } else { |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1697 ngx_time_update(); |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1698 |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1699 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
|
1700 |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1701 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
|
1702 "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
|
1703 |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1704 if (elapsed >= cache->loader_threshold) { |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1705 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
|
1706 } |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1707 } |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1708 |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1709 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
|
1710 } |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1711 |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1712 |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1713 static void |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1714 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
|
1715 { |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1716 ngx_msleep(cache->loader_sleep); |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1717 |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1718 ngx_time_update(); |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1719 |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1720 cache->last = ngx_current_msec; |
5e544655d97b
The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents:
3974
diff
changeset
|
1721 cache->files = 0; |
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 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1724 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1725 static ngx_int_t |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1726 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
|
1727 { |
3970
2d05952a324d
elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents:
3969
diff
changeset
|
1728 u_char *p; |
2d05952a324d
elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents:
3969
diff
changeset
|
1729 ngx_int_t n; |
2d05952a324d
elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents:
3969
diff
changeset
|
1730 ngx_uint_t i; |
2d05952a324d
elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents:
3969
diff
changeset
|
1731 ngx_http_cache_t c; |
2d05952a324d
elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents:
3969
diff
changeset
|
1732 ngx_http_file_cache_t *cache; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1733 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1734 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
|
1735 return NGX_ERROR; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1736 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1737 |
3970
2d05952a324d
elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents:
3969
diff
changeset
|
1738 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
|
1739 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
|
1740 "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
|
1741 return NGX_ERROR; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1742 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1743 |
3970
2d05952a324d
elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents:
3969
diff
changeset
|
1744 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
|
1745 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
|
1746 |
3970
2d05952a324d
elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents:
3969
diff
changeset
|
1747 c.length = ctx->size; |
2d05952a324d
elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents:
3969
diff
changeset
|
1748 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
|
1749 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1750 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
|
1751 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1752 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
|
1753 n = ngx_hextoi(p, 2); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1754 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1755 if (n == NGX_ERROR) { |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1756 return NGX_ERROR; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1757 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1758 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1759 p += 2; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1760 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1761 c.key[i] = (u_char) n; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1762 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1763 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1764 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
|
1765 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1766 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1767 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1768 static ngx_int_t |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1769 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
|
1770 { |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1771 ngx_http_file_cache_node_t *fcn; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1772 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1773 ngx_shmtx_lock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1774 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1775 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
|
1776 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1777 if (fcn == NULL) { |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1778 |
5726
25ade23cf281
Core: added ngx_slab_calloc() and ngx_slab_calloc_locked().
Ruslan Ermilov <ru@nginx.com>
parents:
5679
diff
changeset
|
1779 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
|
1780 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
|
1781 if (fcn == NULL) { |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1782 ngx_shmtx_unlock(&cache->shpool->mutex); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1783 return NGX_ERROR; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1784 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1785 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1786 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
|
1787 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1788 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
|
1789 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
|
1790 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
1791 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
|
1792 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1793 fcn->uses = 1; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1794 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
|
1795 fcn->fs_size = c->fs_size; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1796 |
3899
e7cd13b7f759
Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents:
3885
diff
changeset
|
1797 cache->sh->size += c->fs_size; |
2616
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 } else { |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1800 ngx_queue_remove(&fcn->queue); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1801 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1802 |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1803 fcn->expire = ngx_time() + cache->inactive; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1804 |
2720
b3b8c66bd520
support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2716
diff
changeset
|
1805 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
|
1806 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1807 ngx_shmtx_unlock(&cache->shpool->mutex); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1808 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1809 return NGX_OK; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1810 } |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1811 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1812 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1813 static ngx_int_t |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1814 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
|
1815 { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1816 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
|
1817 "http file cache delete: \"%s\"", path->data); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1818 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1819 if (ngx_delete_file(path->data) == NGX_FILE_ERROR) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1820 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
|
1821 ngx_delete_file_n " \"%s\" failed", path->data); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1822 } |
477 | 1823 |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1824 return NGX_OK; |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1825 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1826 |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1827 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1828 time_t |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1829 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
|
1830 { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1831 ngx_uint_t i; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1832 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
|
1833 |
2626
b0cfe5f66e8d
fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents:
2616
diff
changeset
|
1834 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
|
1835 return 0; |
b0cfe5f66e8d
fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents:
2616
diff
changeset
|
1836 } |
b0cfe5f66e8d
fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents:
2616
diff
changeset
|
1837 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1838 valid = cache_valid->elts; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1839 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
|
1840 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1841 if (valid[i].status == 0) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1842 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
|
1843 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1844 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1845 if (valid[i].status == status) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1846 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
|
1847 } |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1848 } |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1849 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1850 return 0; |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1851 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1852 |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1853 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1854 char * |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1855 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
|
1856 { |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1857 off_t max_size; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1858 u_char *last, *p; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1859 time_t inactive; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1860 ssize_t size; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1861 ngx_str_t s, name, *value; |
4474 | 1862 ngx_int_t loader_files; |
1863 ngx_msec_t loader_sleep, loader_threshold; | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1864 ngx_uint_t i, n; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1865 ngx_http_file_cache_t *cache; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1866 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1867 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
|
1868 if (cache == NULL) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1869 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1870 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1871 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1872 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
|
1873 if (cache->path == NULL) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1874 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1875 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1876 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1877 inactive = 600; |
3974
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
1878 loader_files = 100; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
1879 loader_sleep = 50; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
1880 loader_threshold = 200; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1881 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1882 name.len = 0; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1883 size = 0; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1884 max_size = NGX_MAX_OFF_T_VALUE; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1885 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1886 value = cf->args->elts; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1887 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1888 cache->path->name = value[1]; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1889 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1890 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
|
1891 cache->path->name.len--; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1892 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1893 |
5330
314c3d7cc3a5
Backed out f1a91825730a and 7094bd12c1ff.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5317
diff
changeset
|
1894 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
|
1895 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1896 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1897 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1898 for (i = 2; i < cf->args->nelts; i++) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1899 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1900 if (ngx_strncmp(value[i].data, "levels=", 7) == 0) { |
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 p = value[i].data + 7; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1903 last = value[i].data + value[i].len; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1904 |
2671 | 1905 for (n = 0; n < 3 && p < last; n++) { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1906 |
2671 | 1907 if (*p > '0' && *p < '3') { |
2592
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 cache->path->level[n] = *p++ - '0'; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1910 cache->path->len += cache->path->level[n] + 1; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1911 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1912 if (p == last) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1913 break; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1914 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1915 |
2671 | 1916 if (*p++ == ':' && n < 2 && p != last) { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1917 continue; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1918 } |
2671 | 1919 |
1920 goto invalid_levels; | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1921 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1922 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1923 goto invalid_levels; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1924 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1925 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1926 if (cache->path->len < 10 + 3) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1927 continue; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1928 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1929 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1930 invalid_levels: |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1931 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1932 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1933 "invalid \"levels\" \"%V\"", &value[i]); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1934 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1935 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1936 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1937 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
|
1938 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1939 name.data = value[i].data + 10; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1940 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1941 p = (u_char *) ngx_strchr(name.data, ':'); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1942 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1943 if (p) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1944 name.len = p - name.data; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1945 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1946 p++; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1947 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1948 s.len = value[i].data + value[i].len - p; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1949 s.data = p; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1950 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1951 size = ngx_parse_size(&s); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1952 if (size > 8191) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1953 continue; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1954 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1955 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1956 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1957 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1958 "invalid keys zone size \"%V\"", &value[i]); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1959 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1960 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1961 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1962 if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1963 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1964 s.len = value[i].len - 9; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1965 s.data = value[i].data + 9; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1966 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1967 inactive = ngx_parse_time(&s, 1); |
4474 | 1968 if (inactive == (time_t) NGX_ERROR) { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1969 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1970 "invalid inactive value \"%V\"", &value[i]); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1971 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1972 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1973 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1974 continue; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1975 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1976 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1977 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
|
1978 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1979 s.len = value[i].len - 9; |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1980 s.data = value[i].data + 9; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1981 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1982 max_size = ngx_parse_offset(&s); |
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
1983 if (max_size < 0) { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1984 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
|
1985 "invalid max_size value \"%V\"", &value[i]); |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1986 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1987 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1988 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1989 continue; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1990 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
1991 |
3974
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
1992 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
|
1993 |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
1994 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
|
1995 if (loader_files == NGX_ERROR) { |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
1996 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
|
1997 "invalid loader_files value \"%V\"", &value[i]); |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
1998 return NGX_CONF_ERROR; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
1999 } |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2000 |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2001 continue; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2002 } |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2003 |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2004 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
|
2005 |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2006 s.len = value[i].len - 13; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2007 s.data = value[i].data + 13; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2008 |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2009 loader_sleep = ngx_parse_time(&s, 0); |
4474 | 2010 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
|
2011 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
|
2012 "invalid loader_sleep value \"%V\"", &value[i]); |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2013 return NGX_CONF_ERROR; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2014 } |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2015 |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2016 continue; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2017 } |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2018 |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2019 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
|
2020 |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2021 s.len = value[i].len - 17; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2022 s.data = value[i].data + 17; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2023 |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2024 loader_threshold = ngx_parse_time(&s, 0); |
4474 | 2025 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
|
2026 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
|
2027 "invalid loader_threshold value \"%V\"", &value[i]); |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2028 return NGX_CONF_ERROR; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2029 } |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2030 |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2031 continue; |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2032 } |
d10bcb07d9d4
loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents:
3973
diff
changeset
|
2033 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2034 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2035 "invalid parameter \"%V\"", &value[i]); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2036 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2037 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2038 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2039 if (name.len == 0 || size == 0) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2040 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2041 "\"%V\" must have \"keys_zone\" parameter", |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2042 &cmd->name); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2043 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2044 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2045 |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
2046 cache->path->manager = ngx_http_file_cache_manager; |
3018 | 2047 cache->path->loader = ngx_http_file_cache_loader; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2048 cache->path->data = cache; |
3973
9d6f21415231
set correct configuration file values while adding path
Igor Sysoev <igor@sysoev.ru>
parents:
3972
diff
changeset
|
2049 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
|
2050 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
|
2051 cache->loader_files = loader_files; |
4474 | 2052 cache->loader_sleep = loader_sleep; |
2053 cache->loader_threshold = loader_threshold; | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2054 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2055 if (ngx_add_path(cf, &cache->path) != NGX_OK) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2056 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2057 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2058 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2059 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
|
2060 if (cache->shm_zone == NULL) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2061 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2062 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2063 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2064 if (cache->shm_zone->data) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2065 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2066 "duplicate zone \"%V\"", &name); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2067 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2068 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2069 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2070 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2071 cache->shm_zone->init = ngx_http_file_cache_init; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2072 cache->shm_zone->data = cache; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2073 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2074 cache->inactive = inactive; |
2616
d19979e0d980
introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents:
2611
diff
changeset
|
2075 cache->max_size = max_size; |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2076 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2077 return NGX_CONF_OK; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2078 } |
477 | 2079 |
2080 | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2081 char * |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2082 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
|
2083 void *conf) |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
2084 { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2085 char *p = conf; |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
2086 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2087 time_t valid; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2088 ngx_str_t *value; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2089 ngx_uint_t i, n, status; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2090 ngx_array_t **a; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2091 ngx_http_cache_valid_t *v; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2092 static ngx_uint_t statuses[] = { 200, 301, 302 }; |
477 | 2093 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2094 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
|
2095 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2096 if (*a == NGX_CONF_UNSET_PTR) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2097 *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
|
2098 if (*a == NULL) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2099 return NGX_CONF_ERROR; |
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 } |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
2102 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2103 value = cf->args->elts; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2104 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
|
2105 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2106 valid = ngx_parse_time(&value[n], 1); |
4474 | 2107 if (valid == (time_t) NGX_ERROR) { |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2108 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2109 "invalid time value \"%V\"", &value[n]); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2110 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
|
2111 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
2112 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2113 if (n == 1) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2114 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2115 for (i = 0; i < 3; i++) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2116 v = ngx_array_push(*a); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2117 if (v == NULL) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2118 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2119 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2120 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2121 v->status = statuses[i]; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2122 v->valid = valid; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2123 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2124 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2125 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
|
2126 } |
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
2127 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2128 for (i = 1; i < n; i++) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2129 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2130 if (ngx_strcmp(value[i].data, "any") == 0) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2131 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2132 status = 0; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2133 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2134 } else { |
202
74994aeef848
nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
2135 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2136 status = ngx_atoi(value[i].data, value[i].len); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2137 if (status < 100) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2138 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2139 "invalid status \"%V\"", &value[i]); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2140 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2141 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2142 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2143 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2144 v = ngx_array_push(*a); |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2145 if (v == NULL) { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2146 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2147 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2148 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2149 v->status = status; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2150 v->valid = valid; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2151 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2152 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
633
diff
changeset
|
2153 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
|
2154 } |