annotate src/http/ngx_http_file_cache.c @ 3755:76e3a93821b1

fix race condition if during reconfiguration two cache managers try to delete old inactive entries: one of them removes a entry just locked by other manager from the queue and the rbtree as long inactive entry, causes the latter manager to segfault leaving cache mutex locked, the bug has been introduced in r3727
author Igor Sysoev <igor@sysoev.ru>
date Thu, 02 Sep 2010 14:31:47 +0000
parents 77b18d36d123
children 46938b7418c6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 265
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 265
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
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
4 */
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
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
10 #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
11
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
13 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
14 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
15 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
16 ngx_http_cache_t *c);
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
17 #if (NGX_HAVE_FILE_AIO)
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
18 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
19 #endif
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
20 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
21 ngx_http_cache_t *c);
3696
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
22 static ngx_int_t ngx_http_file_cache_name(ngx_http_request_t *r,
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
23 ngx_path_t *path);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
24 static ngx_http_file_cache_node_t *
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
25 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
26 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
27 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
28 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
29 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
30 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
31 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
32 ngx_queue_t *q, u_char *name);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
33 static ngx_int_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
34 ngx_http_file_cache_manager_sleep(ngx_http_file_cache_t *cache);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
35 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
36 ngx_str_t *path);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
37 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
38 ngx_str_t *path);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
39 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
40 ngx_str_t *path);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
41 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
42 ngx_http_cache_t *c);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
43 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
44 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
45
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
47 ngx_str_t ngx_http_cache_status[] = {
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
48 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
49 ngx_string("BYPASS"),
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
50 ngx_string("EXPIRED"),
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
51 ngx_string("STALE"),
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
52 ngx_string("UPDATING"),
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
53 ngx_string("HIT")
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
54 };
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
55
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
56
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
57 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
58
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
60 static ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
61 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
62 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
63 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
64
2611
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
65 size_t len;
3017
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
66 ngx_uint_t n;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
67 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
68
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
69 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
70
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
71 if (ocache) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
72 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
73 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
74 "cache \"%V\" uses the \"%V\" cache path "
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
75 "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
76 &shm_zone->shm.name, &cache->path->name,
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
77 &ocache->path->name);
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 return NGX_ERROR;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81
3017
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
82 for (n = 0; n < 3; n++) {
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
83 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
84 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
85 "cache \"%V\" had previously different levels",
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
86 &shm_zone->shm.name);
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
87 return NGX_ERROR;
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
88 }
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
89 }
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
90
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
91 cache->sh = ocache->sh;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
92
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
93 cache->shpool = ocache->shpool;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
94 cache->bsize = ocache->bsize;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
95
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
96 cache->max_size /= cache->bsize;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
97
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
98 if (!cache->sh->cold || cache->sh->loading) {
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
99 cache->path->loader = NULL;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
100 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
101
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
102 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
103 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
104
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
105 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
106
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
107 if (shm_zone->shm.exists) {
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
108 cache->sh = cache->shpool->data;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
109 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
110
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
111 return NGX_OK;
2592
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
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
114 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
115 if (cache->sh == NULL) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
116 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
117 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
118
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
119 cache->shpool->data = cache->sh;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
120
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
121 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
122 ngx_http_file_cache_rbtree_insert_value);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
123
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
124 ngx_queue_init(&cache->sh->queue);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
125
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
126 cache->sh->cold = 1;
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
127 cache->sh->loading = 0;
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
128 cache->sh->size = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
129
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
130 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
131
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
132 cache->max_size /= cache->bsize;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
133
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
134 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
135
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
136 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
137 if (cache->shpool->log_ctx == NULL) {
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
138 return NGX_ERROR;
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
139 }
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
140
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
141 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
142 &shm_zone->shm.name);
2611
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
143
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
144 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
145 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
146
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
147
3697
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
148 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
149 ngx_http_file_cache_new(ngx_http_request_t *r)
3697
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
150 {
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
151 ngx_http_cache_t *c;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
152
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
153 c = ngx_pcalloc(r->pool, sizeof(ngx_http_cache_t));
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
154 if (c == NULL) {
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
155 return NGX_ERROR;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
156 }
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
157
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
158 if (ngx_array_init(&c->keys, r->pool, 4, sizeof(ngx_str_t)) != NGX_OK) {
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
159 return NGX_ERROR;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
160 }
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
161
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
162 r->cache = c;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
163 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
164 c->file.fd = NGX_INVALID_FILE;
3697
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
165
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
166 return NGX_OK;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
167 }
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
168
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
169
3699
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
170 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
171 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
172 {
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
173 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
174 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
175 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
176
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
177 ngx_http_file_cache_create_key(r);
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
178
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
179 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
180 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
181
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
182 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
183 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
184 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
185 }
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 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
188 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
189 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
190
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
191 cln->handler = ngx_http_file_cache_cleanup;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
192 cln->data = c;
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 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
195 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
196 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
197
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
198 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
199 }
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
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
202 void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
203 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
204 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
205 size_t len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
206 ngx_str_t *key;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
207 ngx_uint_t i;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
208 ngx_md5_t md5;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
209 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
210
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
211 c = r->cache;
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 len = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
214
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
215 ngx_crc32_init(c->crc32);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
216 ngx_md5_init(&md5);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
217
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
218 key = c->keys.elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
219 for (i = 0; i < c->keys.nelts; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
220 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
221 "http cache key: \"%V\"", &key[i]);
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 len += key[i].len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
224
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
225 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
226 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
227 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
228
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
229 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
230 + sizeof(ngx_http_file_cache_key) + len + 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
231
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
232 ngx_crc32_final(c->crc32);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
233 ngx_md5_final(c->key, &md5);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
234 }
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 ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
238 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
239 {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
240 ngx_int_t rc, rv;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
241 ngx_uint_t cold, test;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
242 ngx_http_cache_t *c;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
243 ngx_pool_cleanup_t *cln;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
244 ngx_open_file_info_t of;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
245 ngx_http_file_cache_t *cache;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
246 ngx_http_core_loc_conf_t *clcf;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
247
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
248 c = r->cache;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
249
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
250 if (c->buf) {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
251 return ngx_http_file_cache_read(r, c);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
252 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
253
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
254 cache = c->file_cache;
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 cln = ngx_pool_cleanup_add(r->pool, 0);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
257 if (cln == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
258 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
259 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
260
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
261 rc = ngx_http_file_cache_exists(cache, c);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
262
2926
80a314b63c56 delete useless r->cache->uses
Igor Sysoev <igor@sysoev.ru>
parents: 2925
diff changeset
263 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
264 "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
265
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
266 if (rc == NGX_ERROR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
267 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
268 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
269
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
270 cln->handler = ngx_http_file_cache_cleanup;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
271 cln->data = c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
272
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
273 if (rc == NGX_AGAIN) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
274 return NGX_HTTP_CACHE_SCARCE;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
275 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
276
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
277 cold = cache->sh->cold;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
278
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
279 if (rc == NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
280
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
281 if (c->error) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
282 return c->error;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
283 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
284
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
285 c->temp_file = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
286 test = c->exists ? 1 : 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
287 rv = NGX_DECLINED;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
288
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
289 } else { /* rc == NGX_DECLINED */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
290
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
291 if (c->min_uses > 1) {
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 (!cold) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
294 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
295 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
297 test = 1;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
298 rv = NGX_HTTP_CACHE_SCARCE;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
299
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
300 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
301 c->temp_file = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
302 test = cold ? 1 : 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
303 rv = NGX_DECLINED;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306
3696
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
307 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
308 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
309 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
310
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
311 if (!test) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
312 return NGX_DECLINED;
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
315 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
316
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
317 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
318
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
319 of.uniq = c->uniq;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
320 of.valid = clcf->open_file_cache_valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
321 of.min_uses = clcf->open_file_cache_min_uses;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
322 of.events = clcf->open_file_cache_events;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
323 of.directio = NGX_OPEN_FILE_DIRECTIO_OFF;
3178
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3136
diff changeset
324 of.read_ahead = clcf->read_ahead;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
325
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
326 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
327 != NGX_OK)
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 switch (of.err) {
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 case 0:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
332 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
333
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
334 case NGX_ENOENT:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
335 case NGX_ENOTDIR:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
336 return rv;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
337
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
338 default:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
339 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
340 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
341 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
342 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
343 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
344
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
345 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
346 "http file cache fd: %d", of.fd);
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 c->file.fd = of.fd;
2603
f9bd7999eb08 fix segfault if ngx_read_file() will fail
Igor Sysoev <igor@sysoev.ru>
parents: 2600
diff changeset
349 c->file.log = r->connection->log;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
350 c->uniq = of.uniq;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
351 c->length = of.size;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
352
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
353 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
354 if (c->buf == NULL) {
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
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
358 return ngx_http_file_cache_read(r, c);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
359 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
360
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
361
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
362 static ngx_int_t
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
363 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
364 {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
365 time_t now;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
366 ssize_t n;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
367 ngx_int_t rc;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
368 ngx_http_file_cache_t *cache;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
369 ngx_http_file_cache_header_t *h;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
370
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
371 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
372
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
373 if (n < 0) {
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374 return n;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376
3369
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3294
diff changeset
377 if ((size_t) n < c->header_start) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
378 ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
379 "cache file \"%s\" is too small", 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
380 return NGX_ERROR;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
383 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
384
3460
bbea0b19b608 fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents: 3400
diff changeset
385 if (h->crc32 != c->crc32) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
386 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
387 "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
388 return NGX_DECLINED;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
391 c->buf->last += n;
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
392
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
393 c->valid_sec = h->valid_sec;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
394 c->last_modified = h->last_modified;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
395 c->date = h->date;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
396 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
397 c->header_start = h->header_start;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
398 c->body_start = h->body_start;
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
399
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
400 r->cached = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
401
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
402 cache = c->file_cache;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
403
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
404 if (cache->sh->cold) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
405
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
406 ngx_shmtx_lock(&cache->shpool->mutex);
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
407
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
408 if (!c->node->exists) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
409 c->node->uses = 1;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
410 c->node->body_start = c->body_start;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
411 c->node->exists = 1;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
412 c->node->uniq = c->uniq;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
413
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
414 cache->sh->size += (c->length + cache->bsize - 1) / cache->bsize;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
415 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
416
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
417 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
418 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
420 now = ngx_time();
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
421
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
422 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
423
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
424 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
425
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
426 if (c->node->updating) {
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
427 rc = NGX_HTTP_CACHE_UPDATING;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
428
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
429 } else {
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
430 c->node->updating = 1;
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
431 c->updating = 1;
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
432 rc = NGX_HTTP_CACHE_STALE;
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
433 }
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
434
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
435 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
436
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
437 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
438 "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
439 rc, c->valid_sec, now);
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
440
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
441 return rc;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
444 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
445 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
446
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
447
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
448 static ssize_t
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
449 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
450 {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
451 #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
452 ssize_t n;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
453 ngx_http_core_loc_conf_t *clcf;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
454
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
455 if (!ngx_file_aio) {
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
456 goto noaio;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
457 }
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
458
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
459 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
460
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
461 if (!clcf->aio) {
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
462 goto noaio;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
463 }
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
464
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
465 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
466
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
467 if (n != NGX_AGAIN) {
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
468 return n;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
469 }
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
470
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
471 c->file.aio->data = r;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
472 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
473
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
474 r->main->blocked++;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
475 r->aio = 1;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
476
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
477 return NGX_AGAIN;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
478
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
479 noaio:
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
480
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
481 #endif
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
482
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
483 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
484 }
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
485
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
486
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
487 #if (NGX_HAVE_FILE_AIO)
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
488
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
489 static void
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
490 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
491 {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
492 ngx_event_aio_t *aio;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
493 ngx_http_request_t *r;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
494
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
495 aio = ev->data;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
496 r = aio->data;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
497
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
498 r->main->blocked--;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
499 r->aio = 0;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
500
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
501 r->connection->write->handler(r->connection->write);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
502 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
503
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
504 #endif
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
505
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
506
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
507 static ngx_int_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
508 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
509 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
510 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
511 ngx_http_file_cache_node_t *fcn;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
512
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
513 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
514
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
515 fcn = ngx_http_file_cache_lookup(cache, c->key);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
516
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
517 if (fcn) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
518 ngx_queue_remove(&fcn->queue);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
519
3724
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
520 fcn->uses++;
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
521 fcn->count++;
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
522
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
523 if (fcn->error) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
524
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
525 if (fcn->valid_sec < ngx_time()) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
526 goto renew;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
527 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
528
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
529 rc = NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
530
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
531 goto done;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
532 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
533
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
534 if (fcn->exists) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
535
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
536 c->exists = fcn->exists;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
537 c->body_start = fcn->body_start;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
538
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
539 rc = NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
540
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
541 goto done;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
542 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
543
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
544 if (fcn->uses >= c->min_uses) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
545
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
546 c->exists = fcn->exists;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
547 c->body_start = fcn->body_start;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
548
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
549 rc = NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
550
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
551 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
552 rc = NGX_AGAIN;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
553 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
554
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
555 goto done;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
556 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
557
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
558 fcn = ngx_slab_alloc_locked(cache->shpool,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
559 sizeof(ngx_http_file_cache_node_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
560 if (fcn == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
561 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
562
2693
197cda0e767e style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2671
diff changeset
563 (void) ngx_http_file_cache_forced_expire(cache);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
564
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
565 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
566
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
567 fcn = ngx_slab_alloc_locked(cache->shpool,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
568 sizeof(ngx_http_file_cache_node_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
569 if (fcn == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
570 rc = NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
571 goto failed;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
572 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
573 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
574
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
575 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
576
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
577 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
578 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
579
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
580 ngx_rbtree_insert(&cache->sh->rbtree, &fcn->node);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
581
3724
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
582 fcn->uses = 1;
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
583 fcn->count = 1;
3744
77b18d36d123 zero fcn->updating after node allocation
Igor Sysoev <igor@sysoev.ru>
parents: 3743
diff changeset
584 fcn->updating = 0;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
585 fcn->deleting = 0;
3724
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
586
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
587 renew:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
588
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
589 rc = NGX_DECLINED;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
590
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
591 fcn->valid_msec = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
592 fcn->error = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
593 fcn->exists = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
594 fcn->valid_sec = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
595 fcn->uniq = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
596 fcn->body_start = 0;
2632
ba1f3cdba725 zero cache file length,
Igor Sysoev <igor@sysoev.ru>
parents: 2631
diff changeset
597 fcn->length = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
598
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
599 done:
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 fcn->expire = ngx_time() + cache->inactive;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
602
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
603 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
604
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
605 c->uniq = fcn->uniq;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
606 c->error = fcn->error;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
607 c->node = fcn;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
608
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
609 failed:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
610
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
611 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
612
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
613 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
614 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
615
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
616
3696
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
617 static ngx_int_t
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
618 ngx_http_file_cache_name(ngx_http_request_t *r, ngx_path_t *path)
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
619 {
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
620 u_char *p;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
621 ngx_http_cache_t *c;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
622
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
623 c = r->cache;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
624
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
625 c->file.name.len = path->name.len + 1 + path->len
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
626 + 2 * NGX_HTTP_CACHE_KEY_LEN;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
627
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
628 c->file.name.data = ngx_pnalloc(r->pool, c->file.name.len + 1);
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
629 if (c->file.name.data == NULL) {
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
630 return NGX_ERROR;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
631 }
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
632
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
633 ngx_memcpy(c->file.name.data, path->name.data, path->name.len);
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
634
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
635 p = c->file.name.data + path->name.len + 1 + path->len;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
636 p = ngx_hex_dump(p, c->key, NGX_HTTP_CACHE_KEY_LEN);
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
637 *p = '\0';
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
638
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
639 ngx_create_hashed_filename(path, c->file.name.data, c->file.name.len);
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
640
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
641 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
642 "cache file: \"%s\"", c->file.name.data);
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
643
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
644 return NGX_OK;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
645 }
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
646
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
647
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
648 static ngx_http_file_cache_node_t *
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
649 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
650 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
651 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
652 ngx_rbtree_key_t node_key;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
653 ngx_rbtree_node_t *node, *sentinel;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
654 ngx_http_file_cache_node_t *fcn;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
655
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
656 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
657
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
658 node = cache->sh->rbtree.root;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
659 sentinel = cache->sh->rbtree.sentinel;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
660
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
661 while (node != sentinel) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
662
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
663 if (node_key < node->key) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
664 node = node->left;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
665 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
666 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
667
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
668 if (node_key > node->key) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
669 node = node->right;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
670 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
671 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
672
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
673 /* node_key == node->key */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
674
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
675 do {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
676 fcn = (ngx_http_file_cache_node_t *) node;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
677
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
678 rc = ngx_memcmp(&key[sizeof(ngx_rbtree_key_t)], fcn->key,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
679 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
680
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
681 if (rc == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
682 return fcn;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
683 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
684
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
685 node = (rc < 0) ? node->left : node->right;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
686
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
687 } while (node != sentinel && node_key == node->key);
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 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
690 }
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 /* not found */
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 return NULL;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
695 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
696
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
697
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
698 static void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
699 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
700 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
701 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
702 ngx_rbtree_node_t **p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
703 ngx_http_file_cache_node_t *cn, *cnt;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
704
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
705 for ( ;; ) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
706
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
707 if (node->key < temp->key) {
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 p = &temp->left;
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 } else if (node->key > temp->key) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
712
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
713 p = &temp->right;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
714
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
715 } else { /* node->key == temp->key */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
716
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
717 cn = (ngx_http_file_cache_node_t *) node;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
718 cnt = (ngx_http_file_cache_node_t *) temp;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
719
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
720 p = (ngx_memcmp(cn->key, cnt->key,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
721 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
722 < 0)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
723 ? &temp->left : &temp->right;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
724 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
725
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
726 if (*p == sentinel) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
727 break;
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 temp = *p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
731 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
732
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
733 *p = node;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
734 node->parent = temp;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
735 node->left = sentinel;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
736 node->right = sentinel;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
737 ngx_rbt_red(node);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
738 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
739
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
740
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
741 void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
742 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
743 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
744 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
745
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
746 u_char *p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
747 ngx_str_t *key;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
748 ngx_uint_t i;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
749 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
750
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
751 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
752 "http file cache set header");
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
753
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
754 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
755
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
756 h->valid_sec = c->valid_sec;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
757 h->last_modified = c->last_modified;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
758 h->date = c->date;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
759 h->crc32 = c->crc32;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
760 h->valid_msec = (u_short) c->valid_msec;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
761 h->header_start = (u_short) c->header_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
762 h->body_start = (u_short) c->body_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
763
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
764 p = buf + sizeof(ngx_http_file_cache_header_t);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
765
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
766 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
767
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
768 key = c->keys.elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
769 for (i = 0; i < c->keys.nelts; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
770 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
771 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
772
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
773 *p = LF;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
774 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
775
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
776
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
777 void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
778 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
779 {
3195
b495a56f1f24 use real file cache length, this fixes cache size counting for responses
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
780 off_t size, length;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
781 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
782 ngx_file_uniq_t uniq;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
783 ngx_file_info_t fi;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
784 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
785 ngx_ext_rename_file_t ext;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
786 ngx_http_file_cache_t *cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
787
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
788 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
789
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
790 if (c->updated) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
791 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
792 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
793
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
794 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
795 "http file cache update");
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
796
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
797 c->updated = 1;
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
798 c->updating = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
799
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
800 cache = c->file_cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
801
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
802 uniq = 0;
3195
b495a56f1f24 use real file cache length, this fixes cache size counting for responses
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
803 length = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
804
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
805 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
806 "http file cache rename: \"%s\" to \"%s\"",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
807 tf->file.name.data, c->file.name.data);
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 ext.access = NGX_FILE_OWNER_ACCESS;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
810 ext.path_access = NGX_FILE_OWNER_ACCESS;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
811 ext.time = -1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
812 ext.create_path = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
813 ext.delete_file = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
814 ext.log = r->connection->log;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
815
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
816 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
817
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
818 if (rc == NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
819
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
820 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
821 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
822 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
823
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
824 rc = NGX_ERROR;
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 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
827 uniq = ngx_file_uniq(&fi);
3195
b495a56f1f24 use real file cache length, this fixes cache size counting for responses
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
828 length = ngx_file_size(&fi);
2592
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
3195
b495a56f1f24 use real file cache length, this fixes cache size counting for responses
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
832 size = (length + cache->bsize - 1) / cache->bsize;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
833
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
834 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
835
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
836 c->node->count--;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
837 c->node->uniq = uniq;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
838 c->node->body_start = c->body_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
839
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
840 size = size - (c->node->length + cache->bsize - 1) / cache->bsize;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
841
3195
b495a56f1f24 use real file cache length, this fixes cache size counting for responses
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
842 c->node->length = length;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
843
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
844 cache->sh->size += size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
845
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
846 if (rc == NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
847 c->node->exists = 1;
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
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
850 c->node->updating = 0;
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
851
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
852 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
853 }
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
856 ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
857 ngx_http_cache_send(ngx_http_request_t *r)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
858 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
859 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
860 ngx_buf_t *b;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
861 ngx_chain_t out;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
862 ngx_http_cache_t *c;
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 c = r->cache;
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 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
867 "http file cache send: %s", c->file.name.data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
868
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
869 /* 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
870
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
871 b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
872 if (b == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
873 return NGX_HTTP_INTERNAL_SERVER_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
874 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
875
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
876 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
877 if (b->file == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
878 return NGX_HTTP_INTERNAL_SERVER_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
879 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
880
3400
8e407e7c899e fix a cached zero-length body case
Igor Sysoev <igor@sysoev.ru>
parents: 3369
diff changeset
881 r->header_only = (c->length - c->body_start) == 0;
8e407e7c899e fix a cached zero-length body case
Igor Sysoev <igor@sysoev.ru>
parents: 3369
diff changeset
882
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
883 rc = ngx_http_send_header(r);
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 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
886 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
887 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
888
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
889 b->file_pos = c->body_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
890 b->file_last = c->length;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
891
3400
8e407e7c899e fix a cached zero-length body case
Igor Sysoev <igor@sysoev.ru>
parents: 3369
diff changeset
892 b->in_file = 1;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
893 b->last_buf = (r == r->main) ? 1: 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
894 b->last_in_chain = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
895
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
896 b->file->fd = c->file.fd;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
897 b->file->name = c->file.name;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
898 b->file->log = r->connection->log;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
899
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
900 out.buf = b;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
901 out.next = NULL;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
902
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
903 return ngx_http_output_filter(r, &out);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
904 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
905
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
906
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
907 void
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
908 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
909 {
3694
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
910 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
911 ngx_http_file_cache_node_t *fcn;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
912
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
913 if (c->updated) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
914 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
915 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
916
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
917 cache = c->file_cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
918
3713
f0b62d1ac7af move debug logging inside ngx_http_file_cache_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3711
diff changeset
919 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
920 "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
921
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
922 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
923
3694
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
924 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
925 fcn->count--;
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
926
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
927 if (c->updating) {
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
928 fcn->updating = 0;
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
929 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
930
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
931 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
932 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
933
3743
c469ffeab569 error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents: 3732
diff changeset
934 if (c->valid_sec) {
c469ffeab569 error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents: 3732
diff changeset
935 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
936 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
937 }
c469ffeab569 error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents: 3732
diff changeset
938
3723
14ad3210fc73 do not free unused cache node if cache min_uses > 1,
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
939 } 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
940 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
941 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
942 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
943 c->node = NULL;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
944 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
945
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
946 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
947
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
948 c->updated = 1;
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
949 c->updating = 0;
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
950
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
951 if (c->temp_file) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
952 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
953 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
954 "http file cache incomplete: \"%s\"",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
955 tf->file.name.data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
956
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
957 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
958 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
959 ngx_delete_file_n " \"%s\" failed",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
960 tf->file.name.data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
961 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
962 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
963 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
964 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
965
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
966
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
967 static void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
968 ngx_http_file_cache_cleanup(void *data)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
969 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
970 ngx_http_cache_t *c = data;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
971
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
972 if (c->updated) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
973 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
974 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
975
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
976 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
977 "http file cache cleanup");
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
978
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
979 if (c->updating) {
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
980 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
981 "stalled cache updating, error:%ui", c->error);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
982 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
983
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
984 ngx_http_file_cache_free(c, NULL);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
985 }
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
988 static time_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
989 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
990 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
991 u_char *name;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
992 size_t len;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
993 time_t wait;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
994 ngx_uint_t tries;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
995 ngx_path_t *path;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
996 ngx_queue_t *q;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
997 ngx_http_file_cache_node_t *fcn;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
998
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
999 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
1000 "http file cache forced expire");
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1001
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1002 path = cache->path;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1003 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
1004
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1005 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
1006 if (name == NULL) {
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1007 return 10;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1008 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1009
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1010 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
1011
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1012 wait = 10;
3728
a29bb11f8c80 change logic slightly
Igor Sysoev <igor@sysoev.ru>
parents: 3727
diff changeset
1013 tries = 20;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1014
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1015 ngx_shmtx_lock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1016
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1017 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
1018 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
1019 q = ngx_queue_prev(q))
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1020 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1021 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
1022
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1023 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
1024 "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
1025 fcn->count, fcn->exists,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1026 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
1027
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1028 if (fcn->count == 0) {
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1029 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
1030
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1031 } else {
3728
a29bb11f8c80 change logic slightly
Igor Sysoev <igor@sysoev.ru>
parents: 3727
diff changeset
1032 if (--tries) {
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1033 continue;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1034 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1035
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1036 wait = 1;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1037 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1038
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1039 break;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1040 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1041
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1042 ngx_shmtx_unlock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1043
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1044 ngx_free(name);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1045
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1046 return wait;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1047 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1048
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1049
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1050 static time_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1051 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
1052 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1053 u_char *name, *p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1054 size_t len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1055 time_t now, wait;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1056 ngx_path_t *path;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1057 ngx_queue_t *q;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1058 ngx_http_file_cache_node_t *fcn;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1059 u_char key[2 * NGX_HTTP_CACHE_KEY_LEN];
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1060
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1061 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
1062 "http file cache expire");
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 path = cache->path;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1065 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
1066
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1067 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
1068 if (name == NULL) {
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1069 return 10;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1070 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1071
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1072 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
1073
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1074 now = ngx_time();
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1075
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1076 ngx_shmtx_lock(&cache->shpool->mutex);
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 for ( ;; ) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1079
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1080 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
1081 wait = 10;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1082 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1083 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1084
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1085 q = ngx_queue_last(&cache->sh->queue);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1086
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1087 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
1088
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1089 wait = fcn->expire - now;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1090
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1091 if (wait > 0) {
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1092 wait = wait > 10 ? 10 : wait;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1093 break;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1094 }
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 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
1097 "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
1098 fcn->count, fcn->exists,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1099 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
1100
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1101 if (fcn->count == 0) {
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1102 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
1103 continue;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1104 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1105
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1106 if (fcn->deleting) {
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1107 continue;
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1108 }
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1109
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1110 p = ngx_hex_dump(key, (u_char *) &fcn->node.key,
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1111 sizeof(ngx_rbtree_key_t));
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1112 len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1113 (void) ngx_hex_dump(p, fcn->key, len);
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1114
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1115 /*
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1116 * abnormally exited workers may leave locked cache entries,
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1117 * and although it may be safe to remove them completely,
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1118 * we prefer to remove them from inactive queue and rbtree
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1119 * only, and to allow other leaks
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1120 */
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1121
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1122 ngx_queue_remove(q);
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1123 ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1124
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1125 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1126 "ignore long locked inactive cache entry %*s, count:%d",
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1127 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
1128 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1129
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1130 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1131
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1132 ngx_free(name);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1133
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1134 return wait;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1135 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1136
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1137
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1138 static void
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1139 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
1140 u_char *name)
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1141 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1142 u_char *p;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1143 size_t len;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1144 ngx_path_t *path;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1145 ngx_http_file_cache_node_t *fcn;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1146
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1147 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
1148
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1149 if (fcn->exists) {
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1150 cache->sh->size -= (fcn->length + cache->bsize - 1) / cache->bsize;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1151
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1152 path = cache->path;
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1153 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
1154 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
1155 sizeof(ngx_rbtree_key_t));
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1156 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
1157 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
1158 *p = '\0';
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1159
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1160 fcn->count++;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1161 fcn->deleting = 1;
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1162 ngx_shmtx_unlock(&cache->shpool->mutex);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1163
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1164 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
1165 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
1166
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1167 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
1168 "http file cache expire: \"%s\"", name);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1169
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1170 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
1171 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
1172 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
1173 }
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1174
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1175 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
1176 fcn->count--;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1177 fcn->deleting = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1178 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1179
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1180 if (fcn->count == 0) {
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1181 ngx_queue_remove(q);
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1182 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
1183 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
1184 }
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1185 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1186
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1187
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1188 static time_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1189 ngx_http_file_cache_manager(void *data)
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1190 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1191 ngx_http_file_cache_t *cache = data;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1192
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1193 off_t size;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1194 time_t next;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1195
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1196 next = ngx_http_file_cache_expire(cache);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1197
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1198 cache->last = ngx_current_msec;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1199 cache->files = 0;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1200
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1201 for ( ;; ) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1202 ngx_shmtx_lock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1203
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1204 size = cache->sh->size;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1205
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1206 ngx_shmtx_unlock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1207
2631
73571521c2eb add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2626
diff changeset
1208 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
73571521c2eb add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2626
diff changeset
1209 "http file cache size: %O", size);
73571521c2eb add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2626
diff changeset
1210
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1211 if (size < cache->max_size) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1212 return next;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1213 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1214
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1215 next = ngx_http_file_cache_forced_expire(cache);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1216
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1217 if (ngx_http_file_cache_manager_sleep(cache) != NGX_OK) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1218 return next;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1219 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1220 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1221 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1222
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1223
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1224 static void
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1225 ngx_http_file_cache_loader(void *data)
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1226 {
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1227 ngx_http_file_cache_t *cache = data;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1228
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1229 ngx_tree_ctx_t tree;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1230
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1231 if (!cache->sh->cold || cache->sh->loading) {
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1232 return;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1233 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1234
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1235 if (!ngx_atomic_cmp_set(&cache->sh->loading, 0, ngx_pid)) {
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1236 return;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1237 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1238
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1239 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1240 "http file cache loader");
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1241
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1242 tree.init_handler = NULL;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1243 tree.file_handler = ngx_http_file_cache_manage_file;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1244 tree.pre_tree_handler = ngx_http_file_cache_noop;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1245 tree.post_tree_handler = ngx_http_file_cache_noop;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1246 tree.spec_handler = ngx_http_file_cache_delete_file;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1247 tree.data = cache;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1248 tree.alloc = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1249 tree.log = ngx_cycle->log;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1250
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1251 cache->last = ngx_current_msec;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1252 cache->files = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1253
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1254 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
1255 cache->sh->loading = 0;
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1256 return;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1257 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1258
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1259 cache->sh->cold = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1260 cache->sh->loading = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1261
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1262 ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1263 "http file cache: %V %.3fM, bsize: %uz",
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1264 &cache->path->name,
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1265 ((double) cache->sh->size * cache->bsize) / (1024 * 1024),
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1266 cache->bsize);
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1267 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1268
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1269
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1270 static ngx_int_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1271 ngx_http_file_cache_manager_sleep(ngx_http_file_cache_t *cache)
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1272 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1273 ngx_msec_t elapsed;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1274
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1275 if (cache->files++ > 100) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1276
3475
ab353d7dc182 *) introduce ngx_time_sigsafe_update() to update the error log time only
Igor Sysoev <igor@sysoev.ru>
parents: 3474
diff changeset
1277 ngx_time_update();
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1278
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1279 elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last));
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1280
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1281 ngx_log_debug1(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
1282 "http file cache manager time: %M", elapsed);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1283
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1284 if (elapsed > 200) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1285
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1286 /*
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1287 * if processing 100 files takes more than 200ms,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1288 * it seems that many operations require disk i/o,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1289 * therefore sleep 200ms
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1290 */
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1291
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1292 ngx_msleep(200);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1293
3475
ab353d7dc182 *) introduce ngx_time_sigsafe_update() to update the error log time only
Igor Sysoev <igor@sysoev.ru>
parents: 3474
diff changeset
1294 ngx_time_update();
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1295 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1296
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1297 cache->last = ngx_current_msec;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1298 cache->files = 0;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1299 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1300
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1301 return (ngx_quit || ngx_terminate) ? NGX_ABORT : NGX_OK;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1302 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1303
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1304
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1305 static ngx_int_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1306 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
1307 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1308 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1309 }
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1312 static ngx_int_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1313 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
1314 {
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1315 ngx_http_file_cache_t *cache;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1316
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1317 cache = ctx->data;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1318
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1319 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
1320 (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
1321 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1322
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1323 return ngx_http_file_cache_manager_sleep(cache);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1324 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1325
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1326
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1327 static ngx_int_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1328 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
1329 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1330 u_char *p;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1331 ngx_fd_t fd;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1332 ngx_int_t n;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1333 ngx_uint_t i;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1334 ngx_file_info_t fi;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1335 ngx_http_cache_t c;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1336 ngx_http_file_cache_t *cache;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1337 ngx_http_file_cache_header_t h;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1338
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1339 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
1340 return NGX_ERROR;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1341 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1342
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1343 ngx_memzero(&c, sizeof(ngx_http_cache_t));
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1344
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1345 fd = ngx_open_file(name->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1346
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1347 if (fd == NGX_INVALID_FILE) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1348 ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1349 ngx_open_file_n " \"%s\" failed", name->data);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1350 return NGX_ERROR;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1351 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1352
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1353 c.file.fd = fd;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1354 c.file.name = *name;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1355 c.file.log = ctx->log;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1356
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1357 n = ngx_read_file(&c.file, (u_char *) &h,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1358 sizeof(ngx_http_file_cache_header_t), 0);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1359 if (n == NGX_ERROR) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1360 return NGX_ERROR;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1361 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1362
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1363 if ((size_t) n < sizeof(ngx_http_file_cache_header_t)) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1364 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
1365 "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
1366 return NGX_ERROR;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1367 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1368
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1369 if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1370 ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1371 ngx_fd_info_n " \"%s\" failed", name->data);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1372
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1373 } else {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1374 c.uniq = ngx_file_uniq(&fi);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1375 c.valid_sec = h.valid_sec;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1376 c.valid_msec = h.valid_msec;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1377 c.body_start = h.body_start;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1378 c.length = ngx_file_size(&fi);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1379 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1380
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1381 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1382 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1383 ngx_close_file_n " \"%s\" failed", name->data);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1384 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1385
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1386 if (c.body_start == 0) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1387 return NGX_ERROR;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1388 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1389
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1390 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
1391
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1392 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
1393 n = ngx_hextoi(p, 2);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1394
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1395 if (n == NGX_ERROR) {
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1396 return NGX_ERROR;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1397 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1398
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1399 p += 2;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1400
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1401 c.key[i] = (u_char) n;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1402 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1403
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1404 cache = ctx->data;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1405
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1406 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
1407 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1408
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1409
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1410 static ngx_int_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1411 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
1412 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1413 ngx_http_file_cache_node_t *fcn;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1414
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1415 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1416
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1417 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
1418
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1419 if (fcn == NULL) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1420
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1421 fcn = ngx_slab_alloc_locked(cache->shpool,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1422 sizeof(ngx_http_file_cache_node_t));
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1423 if (fcn == NULL) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1424 ngx_shmtx_unlock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1425 return NGX_ERROR;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1426 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1427
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1428 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
1429
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1430 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
1431 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
1432
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1433 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
1434
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1435 fcn->uses = 1;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1436 fcn->count = 0;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1437 fcn->valid_msec = c->valid_msec;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1438 fcn->error = 0;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1439 fcn->exists = 1;
3744
77b18d36d123 zero fcn->updating after node allocation
Igor Sysoev <igor@sysoev.ru>
parents: 3743
diff changeset
1440 fcn->updating = 0;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1441 fcn->deleting = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1442 fcn->uniq = c->uniq;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1443 fcn->valid_sec = c->valid_sec;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1444 fcn->body_start = c->body_start;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1445 fcn->length = c->length;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1446
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1447 cache->sh->size += (c->length + cache->bsize - 1) / cache->bsize;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1448
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1449 } else {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1450 ngx_queue_remove(&fcn->queue);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1451 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1452
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1453 fcn->expire = ngx_time() + cache->inactive;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1454
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1455 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
1456
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1457 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1458
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1459 return NGX_OK;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1460 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1461
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1462
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1463 static ngx_int_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1464 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
1465 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1466 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
1467 "http file cache delete: \"%s\"", path->data);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1468
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1469 if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1470 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
1471 ngx_delete_file_n " \"%s\" failed", path->data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1472 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
1473
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1474 return NGX_OK;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1475 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1476
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1477
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1478 time_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1479 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
1480 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1481 ngx_uint_t i;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1482 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
1483
2626
b0cfe5f66e8d fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents: 2616
diff changeset
1484 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
1485 return 0;
b0cfe5f66e8d fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents: 2616
diff changeset
1486 }
b0cfe5f66e8d fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents: 2616
diff changeset
1487
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1488 valid = cache_valid->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1489 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
1490
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1491 if (valid[i].status == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1492 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
1493 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1494
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1495 if (valid[i].status == status) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1496 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
1497 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1498 }
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1499
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1500 return 0;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1501 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1502
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1503
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1504 char *
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1505 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
1506 {
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1507 off_t max_size;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1508 u_char *last, *p;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1509 time_t inactive;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1510 ssize_t size;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1511 ngx_str_t s, name, *value;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1512 ngx_uint_t i, n;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1513 ngx_http_file_cache_t *cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1514
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1515 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
1516 if (cache == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1517 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1518 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1519
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1520 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
1521 if (cache->path == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1522 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1523 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1524
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1525 inactive = 600;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1526
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1527 name.len = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1528 size = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1529 max_size = NGX_MAX_OFF_T_VALUE;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1530
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1531 value = cf->args->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1532
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1533 cache->path->name = value[1];
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1534
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1535 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
1536 cache->path->name.len--;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1537 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1538
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1539 if (ngx_conf_full_name(cf->cycle, &cache->path->name, 0) != NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1540 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1541 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1542
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1543 for (i = 2; i < cf->args->nelts; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1544
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1545 if (ngx_strncmp(value[i].data, "levels=", 7) == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1546
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1547 p = value[i].data + 7;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1548 last = value[i].data + value[i].len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1549
2671
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
1550 for (n = 0; n < 3 && p < last; n++) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1551
2671
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
1552 if (*p > '0' && *p < '3') {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1553
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1554 cache->path->level[n] = *p++ - '0';
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1555 cache->path->len += cache->path->level[n] + 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1556
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1557 if (p == last) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1558 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1559 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1560
2671
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
1561 if (*p++ == ':' && n < 2 && p != last) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1562 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1563 }
2671
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
1564
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
1565 goto invalid_levels;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1566 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1567
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1568 goto invalid_levels;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1569 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1570
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1571 if (cache->path->len < 10 + 3) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1572 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1573 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1574
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1575 invalid_levels:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1576
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1577 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1578 "invalid \"levels\" \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1579 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1580 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1581
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1582 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
1583
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1584 name.data = value[i].data + 10;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1585
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1586 p = (u_char *) ngx_strchr(name.data, ':');
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1587
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1588 if (p) {
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
1589 *p = '\0';
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
1590
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1591 name.len = p - name.data;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1593 p++;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1594
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1595 s.len = value[i].data + value[i].len - p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1596 s.data = p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1597
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1598 size = ngx_parse_size(&s);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1599 if (size > 8191) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1600 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1601 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1602 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1603
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1604 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1605 "invalid keys zone size \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1606 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1607 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1608
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1609 if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1610
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1611 s.len = value[i].len - 9;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1612 s.data = value[i].data + 9;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1613
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1614 inactive = ngx_parse_time(&s, 1);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1615 if (inactive < 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1616 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1617 "invalid inactive value \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1618 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1619 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1620
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1621 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1622 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1623
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1624 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
1625
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1626 s.len = value[i].len - 9;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1627 s.data = value[i].data + 9;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1628
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1629 max_size = ngx_parse_offset(&s);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1630 if (max_size < 0) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1631 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
1632 "invalid max_size value \"%V\"", &value[i]);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1633 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1634 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1635
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1636 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1637 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1638
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1639 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1640 "invalid parameter \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1641 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1642 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1643
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1644 if (name.len == 0 || size == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1645 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1646 "\"%V\" must have \"keys_zone\" parameter",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1647 &cmd->name);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1648 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1649 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1650
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1651 cache->path->manager = ngx_http_file_cache_manager;
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1652 cache->path->loader = ngx_http_file_cache_loader;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1653 cache->path->data = cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1654
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1655 if (ngx_add_path(cf, &cache->path) != NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1656 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1657 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1658
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1659 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
1660 if (cache->shm_zone == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1661 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1662 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1663
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1664 if (cache->shm_zone->data) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1665 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1666 "duplicate zone \"%V\"", &name);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1667 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1668 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1669
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1670
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1671 cache->shm_zone->init = ngx_http_file_cache_init;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1672 cache->shm_zone->data = cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1673
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1674 cache->inactive = inactive;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1675 cache->max_size = max_size;
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_CONF_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1678 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
1679
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
1680
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1681 char *
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1682 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
1683 void *conf)
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1684 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1685 char *p = conf;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1686
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1687 time_t valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1688 ngx_str_t *value;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1689 ngx_uint_t i, n, status;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1690 ngx_array_t **a;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1691 ngx_http_cache_valid_t *v;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1692 static ngx_uint_t statuses[] = { 200, 301, 302 };
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
1693
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1694 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
1695
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1696 if (*a == NGX_CONF_UNSET_PTR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1697 *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
1698 if (*a == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1699 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1700 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1701 }
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1702
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1703 value = cf->args->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1704 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
1705
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1706 valid = ngx_parse_time(&value[n], 1);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1707 if (valid < 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1708 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1709 "invalid time value \"%V\"", &value[n]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1710 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
1711 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1712
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1713 if (n == 1) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1714
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1715 for (i = 0; i < 3; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1716 v = ngx_array_push(*a);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1717 if (v == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1718 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1719 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1720
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1721 v->status = statuses[i];
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1722 v->valid = valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1723 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1724
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1725 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
1726 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1727
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1728 for (i = 1; i < n; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1729
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1730 if (ngx_strcmp(value[i].data, "any") == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1731
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1732 status = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1733
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1734 } else {
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1735
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1736 status = ngx_atoi(value[i].data, value[i].len);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1737 if (status < 100) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1738 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1739 "invalid status \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1740 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1741 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1742 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1743
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1744 v = ngx_array_push(*a);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1745 if (v == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1746 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1747 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1748
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1749 v->status = status;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1750 v->valid = valid;
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1753 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
1754 }
3526
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1755
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1756
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1757 ngx_int_t
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1758 ngx_http_cache(ngx_http_request_t *r, ngx_array_t *no_cache)
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1759 {
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1760 ngx_str_t val;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1761 ngx_uint_t i;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1762 ngx_http_complex_value_t *cv;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1763
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1764 cv = no_cache->elts;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1765
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1766 for (i = 0; i < no_cache->nelts; i++) {
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1767 if (ngx_http_complex_value(r, &cv[i], &val) != NGX_OK) {
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1768 return NGX_ERROR;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1769 }
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1770
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1771 if (val.len && val.data[0] != '0') {
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1772 return NGX_DECLINED;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1773 }
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1774 }
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1775
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1776 return NGX_OK;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1777 }
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1778
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1779
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1780 char *
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1781 ngx_http_no_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1782 {
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1783 char *p = conf;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1784
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1785 ngx_str_t *value;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1786 ngx_uint_t i;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1787 ngx_array_t **a;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1788 ngx_http_complex_value_t *cv;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1789 ngx_http_compile_complex_value_t ccv;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1790
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1791 a = (ngx_array_t **) (p + cmd->offset);
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1792
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1793 if (*a == NGX_CONF_UNSET_PTR) {
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1794 *a = ngx_array_create(cf->pool, 1, sizeof(ngx_http_complex_value_t));
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1795 if (*a == NULL) {
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1796 return NGX_CONF_ERROR;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1797 }
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1798 }
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1799
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1800 value = cf->args->elts;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1801
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1802 for (i = 1; i < cf->args->nelts; i++) {
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1803 cv = ngx_array_push(*a);
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1804 if (cv == NULL) {
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1805 return NGX_CONF_ERROR;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1806 }
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1807
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1808 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1809
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1810 ccv.cf = cf;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1811 ccv.value = &value[i];
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1812 ccv.complex_value = cv;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1813
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1814 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1815 return NGX_CONF_ERROR;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1816 }
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1817 }
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1818
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1819 return NGX_CONF_OK;
62a4fd1e6e2c proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents: 3475
diff changeset
1820 }