annotate src/http/ngx_http_file_cache.c @ 4340:4533d7684e14

Cache: only complain on long locked entries. There have been multiple reports of cases where a real locked entry was removed, resulting in a segmentation fault later in a worker which locked the entry. It looks like default inactive timeout isn't enough in real life. For now just ignore such locked entries, and move them to the top of the inactive queue to allow processing of other entries.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 12 Dec 2011 10:49:14 +0000
parents 6f97afc238de
children 70ba81827472
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);
4018
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
33 static void ngx_http_file_cache_loader_sleep(ngx_http_file_cache_t *cache);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
34 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
35 ngx_str_t *path);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
36 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
37 ngx_str_t *path);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
38 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
39 ngx_str_t *path);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
40 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
41 ngx_http_cache_t *c);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
42 static ngx_int_t ngx_http_file_cache_delete_file(ngx_tree_ctx_t *ctx,
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
43 ngx_str_t *path);
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
46 ngx_str_t ngx_http_cache_status[] = {
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
47 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
48 ngx_string("BYPASS"),
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
49 ngx_string("EXPIRED"),
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
50 ngx_string("STALE"),
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
51 ngx_string("UPDATING"),
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
52 ngx_string("HIT")
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2935
diff changeset
53 };
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
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
56 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
57
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
59 static ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
60 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
61 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
62 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
63
2611
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
64 size_t len;
3017
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
65 ngx_uint_t n;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
66 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
67
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
68 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
69
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
70 if (ocache) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
71 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
72 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
73 "cache \"%V\" uses the \"%V\" cache path "
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
74 "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
75 &shm_zone->shm.name, &cache->path->name,
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
76 &ocache->path->name);
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 return NGX_ERROR;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80
3017
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
81 for (n = 0; n < 3; n++) {
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
82 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
83 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
84 "cache \"%V\" had previously different levels",
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
85 &shm_zone->shm.name);
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
86 return NGX_ERROR;
c466605d9426 test cache path levels while reconfiguration
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
87 }
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
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
90 cache->sh = ocache->sh;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
91
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
92 cache->shpool = ocache->shpool;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
93 cache->bsize = ocache->bsize;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
94
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
95 cache->max_size /= cache->bsize;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
96
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
97 if (!cache->sh->cold || cache->sh->loading) {
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
98 cache->path->loader = NULL;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
99 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
100
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
101 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
102 }
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 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
105
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
106 if (shm_zone->shm.exists) {
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
107 cache->sh = cache->shpool->data;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
108 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
109
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
110 return NGX_OK;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
111 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
112
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
113 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
114 if (cache->sh == NULL) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
115 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
116 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
117
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
118 cache->shpool->data = cache->sh;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
119
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
120 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
121 ngx_http_file_cache_rbtree_insert_value);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
122
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
123 ngx_queue_init(&cache->sh->queue);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
124
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
125 cache->sh->cold = 1;
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
126 cache->sh->loading = 0;
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
127 cache->sh->size = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
128
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
129 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
130
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
131 cache->max_size /= cache->bsize;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
132
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
133 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
134
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
135 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
136 if (cache->shpool->log_ctx == NULL) {
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
137 return NGX_ERROR;
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
138 }
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 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
141 &shm_zone->shm.name);
2611
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2606
diff changeset
142
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
143 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
144 }
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
3697
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
147 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
148 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
149 {
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
150 ngx_http_cache_t *c;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
151
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
152 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
153 if (c == NULL) {
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
154 return NGX_ERROR;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
155 }
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 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
158 return NGX_ERROR;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
159 }
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 r->cache = c;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
162 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
163 c->file.fd = NGX_INVALID_FILE;
3697
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
164
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
165 return NGX_OK;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3696
diff changeset
166 }
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
3699
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
169 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
170 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
171 {
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
172 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
173 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
174 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
175
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
176 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
177 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
178
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
179 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
180 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
181 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
182 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
183
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
184 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
185 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
186 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
187
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
188 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
189 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
190
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
191 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
192 return NGX_ERROR;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
193 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
194
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_OK;
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
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
199 void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
200 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
201 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
202 size_t len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
203 ngx_str_t *key;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
204 ngx_uint_t i;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
205 ngx_md5_t md5;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
206 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
207
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
208 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
209
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
210 len = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
211
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
212 ngx_crc32_init(c->crc32);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
213 ngx_md5_init(&md5);
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 key = c->keys.elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
216 for (i = 0; i < c->keys.nelts; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
217 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
218 "http cache key: \"%V\"", &key[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
219
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
220 len += key[i].len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
221
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
222 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
223 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
224 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
225
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
226 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
227 + sizeof(ngx_http_file_cache_key) + len + 1;
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 ngx_crc32_final(c->crc32);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
230 ngx_md5_final(c->key, &md5);
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
233
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
234 ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
235 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
236 {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
237 ngx_int_t rc, rv;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
238 ngx_uint_t cold, test;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
239 ngx_http_cache_t *c;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
240 ngx_pool_cleanup_t *cln;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
241 ngx_open_file_info_t of;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
242 ngx_http_file_cache_t *cache;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
243 ngx_http_core_loc_conf_t *clcf;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
244
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
245 c = r->cache;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
246
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
247 if (c->buf) {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
248 return ngx_http_file_cache_read(r, c);
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
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
251 cache = c->file_cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
252
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
253 cln = ngx_pool_cleanup_add(r->pool, 0);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
254 if (cln == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
255 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
256 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
257
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
258 rc = ngx_http_file_cache_exists(cache, c);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
259
2926
80a314b63c56 delete useless r->cache->uses
Igor Sysoev <igor@sysoev.ru>
parents: 2925
diff changeset
260 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
261 "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
262
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
263 if (rc == NGX_ERROR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
264 return rc;
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
267 cln->handler = ngx_http_file_cache_cleanup;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
268 cln->data = c;
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 if (rc == NGX_AGAIN) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
271 return NGX_HTTP_CACHE_SCARCE;
2592
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
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
274 cold = cache->sh->cold;
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 if (rc == NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
277
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
278 if (c->error) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
279 return c->error;
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
282 c->temp_file = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
283 test = c->exists ? 1 : 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
284 rv = NGX_DECLINED;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
285
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
286 } else { /* rc == NGX_DECLINED */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
287
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
288 if (c->min_uses > 1) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
289
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
290 if (!cold) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
291 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
292 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
294 test = 1;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
295 rv = NGX_HTTP_CACHE_SCARCE;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
296
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
297 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
298 c->temp_file = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
299 test = cold ? 1 : 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
300 rv = NGX_DECLINED;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303
3696
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
304 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
305 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
306 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
307
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
308 if (!test) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
309 return NGX_DECLINED;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
310 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
311
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
312 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
313
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
314 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
315
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
316 of.uniq = c->uniq;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
317 of.valid = clcf->open_file_cache_valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
318 of.min_uses = clcf->open_file_cache_min_uses;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
319 of.events = clcf->open_file_cache_events;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
320 of.directio = NGX_OPEN_FILE_DIRECTIO_OFF;
3178
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3136
diff changeset
321 of.read_ahead = clcf->read_ahead;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
322
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
323 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
324 != NGX_OK)
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 switch (of.err) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
327
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
328 case 0:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
329 return NGX_ERROR;
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 NGX_ENOENT:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
332 case NGX_ENOTDIR:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
333 return rv;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
334
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
335 default:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
336 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
337 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
338 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
339 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
340 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
341
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
342 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
343 "http file cache fd: %d", of.fd);
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 c->file.fd = of.fd;
2603
f9bd7999eb08 fix segfault if ngx_read_file() will fail
Igor Sysoev <igor@sysoev.ru>
parents: 2600
diff changeset
346 c->file.log = r->connection->log;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
347 c->uniq = of.uniq;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
348 c->length = of.size;
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
349 c->fs_size = (of.fs_size + cache->bsize - 1) / cache->bsize;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
350
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
351 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
352 if (c->buf == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
353 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
354 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
355
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
356 return ngx_http_file_cache_read(r, c);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
357 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
358
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 static ngx_int_t
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
361 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
362 {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
363 time_t now;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
364 ssize_t n;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
365 ngx_int_t rc;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
366 ngx_http_file_cache_t *cache;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
367 ngx_http_file_cache_header_t *h;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
368
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
369 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
370
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
371 if (n < 0) {
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372 return n;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374
3369
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3294
diff changeset
375 if ((size_t) n < c->header_start) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
376 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
377 "cache file \"%s\" is too small", c->file.name.data);
3971
44f4fc874b2f do not close connection if cache file is too small: replace it with valid one
Igor Sysoev <igor@sysoev.ru>
parents: 3970
diff changeset
378 return NGX_DECLINED;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
381 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
382
3460
bbea0b19b608 fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents: 3400
diff changeset
383 if (h->crc32 != c->crc32) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
384 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
385 "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
386 return NGX_DECLINED;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388
4339
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
389 if (h->body_start > c->body_start) {
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
390 ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
391 "cache file \"%s\" has too long header",
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
392 c->file.name.data);
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
393 return NGX_DECLINED;
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
394 }
6f97afc238de Cache: handling of cache files with long headers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4338
diff changeset
395
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
396 c->buf->last += n;
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
397
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
398 c->valid_sec = h->valid_sec;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
399 c->last_modified = h->last_modified;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
400 c->date = h->date;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
401 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
402 c->header_start = h->header_start;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
403 c->body_start = h->body_start;
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
404
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
405 r->cached = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
406
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
407 cache = c->file_cache;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
408
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
409 if (cache->sh->cold) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
410
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
411 ngx_shmtx_lock(&cache->shpool->mutex);
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
412
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
413 if (!c->node->exists) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
414 c->node->uses = 1;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
415 c->node->body_start = c->body_start;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
416 c->node->exists = 1;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
417 c->node->uniq = c->uniq;
4034
e2c075e774b6 Cache size accounting fix: actual cache size on disk was less than
Igor Sysoev <igor@sysoev.ru>
parents: 4018
diff changeset
418 c->node->fs_size = c->fs_size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
419
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
420 cache->sh->size += c->fs_size;
2616
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
423 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
424 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
426 now = ngx_time();
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
427
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
428 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
429
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
430 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
431
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
432 if (c->node->updating) {
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
433 rc = NGX_HTTP_CACHE_UPDATING;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
434
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
435 } else {
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
436 c->node->updating = 1;
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
437 c->updating = 1;
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
438 rc = NGX_HTTP_CACHE_STALE;
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
439 }
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 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
442
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
443 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
444 "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
445 rc, c->valid_sec, now);
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
446
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
447 return rc;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
450 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
451 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
452
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
453
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
454 static ssize_t
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
455 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
456 {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
457 #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
458 ssize_t n;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
459 ngx_http_core_loc_conf_t *clcf;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
460
3294
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
461 if (!ngx_file_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 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
466
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
467 if (!clcf->aio) {
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
468 goto noaio;
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 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
472
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
473 if (n != NGX_AGAIN) {
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
474 return n;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
475 }
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 c->file.aio->data = r;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
478 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
479
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
480 r->main->blocked++;
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
481 r->aio = 1;
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_AGAIN;
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 noaio:
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 #endif
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
488
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
489 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
490 }
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
491
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
492
04cfc09b8b8d export aio presence knowledge to prevent using "aio sendfile",
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
493 #if (NGX_HAVE_FILE_AIO)
3052
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 static void
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
496 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
497 {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
498 ngx_event_aio_t *aio;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
499 ngx_http_request_t *r;
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 aio = ev->data;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
502 r = aio->data;
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 r->main->blocked--;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
505 r->aio = 0;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
506
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
507 r->connection->write->handler(r->connection->write);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
508 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
509
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
510 #endif
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
511
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
512
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
513 static ngx_int_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
514 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
515 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
516 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
517 ngx_http_file_cache_node_t *fcn;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
518
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
519 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
520
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
521 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
522
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
523 if (fcn) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
524 ngx_queue_remove(&fcn->queue);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
525
3724
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
526 fcn->uses++;
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
527 fcn->count++;
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
528
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
529 if (fcn->error) {
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 if (fcn->valid_sec < ngx_time()) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
532 goto renew;
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
535 rc = NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
536
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
537 goto done;
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
3966
9c425f22ea36 fuse two if's in one condition
Igor Sysoev <igor@sysoev.ru>
parents: 3965
diff changeset
540 if (fcn->exists || fcn->uses >= c->min_uses) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
541
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
542 c->exists = fcn->exists;
3969
3ea15c6b16da fix r3968
Igor Sysoev <igor@sysoev.ru>
parents: 3968
diff changeset
543 if (fcn->body_start) {
3967
83e41f6f6d96 The cache loader performs two tasks: inserting cache objects in inactivity
Igor Sysoev <igor@sysoev.ru>
parents: 3966
diff changeset
544 c->body_start = fcn->body_start;
83e41f6f6d96 The cache loader performs two tasks: inserting cache objects in inactivity
Igor Sysoev <igor@sysoev.ru>
parents: 3966
diff changeset
545 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
546
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
547 rc = NGX_OK;
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 goto done;
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
3966
9c425f22ea36 fuse two if's in one condition
Igor Sysoev <igor@sysoev.ru>
parents: 3965
diff changeset
552 rc = NGX_AGAIN;
2592
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 goto done;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
555 }
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 fcn = ngx_slab_alloc_locked(cache->shpool,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
558 sizeof(ngx_http_file_cache_node_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
559 if (fcn == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
560 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
561
2693
197cda0e767e style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2671
diff changeset
562 (void) ngx_http_file_cache_forced_expire(cache);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
563
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
564 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
565
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
566 fcn = ngx_slab_alloc_locked(cache->shpool,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
567 sizeof(ngx_http_file_cache_node_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
568 if (fcn == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
569 rc = NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
570 goto failed;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
571 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
572 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
573
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
574 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
575
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
576 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
577 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
578
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
579 ngx_rbtree_insert(&cache->sh->rbtree, &fcn->node);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
580
3724
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
581 fcn->uses = 1;
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
582 fcn->count = 1;
3744
77b18d36d123 zero fcn->updating after node allocation
Igor Sysoev <igor@sysoev.ru>
parents: 3743
diff changeset
583 fcn->updating = 0;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
584 fcn->deleting = 0;
3724
e9f0a2497d3c count cache key node usage for cached error statuses
Igor Sysoev <igor@sysoev.ru>
parents: 3723
diff changeset
585
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
586 renew:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
587
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
588 rc = NGX_DECLINED;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
589
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
590 fcn->valid_msec = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
591 fcn->error = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
592 fcn->exists = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
593 fcn->valid_sec = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
594 fcn->uniq = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
595 fcn->body_start = 0;
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
596 fcn->fs_size = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
597
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
598 done:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
599
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
600 fcn->expire = ngx_time() + cache->inactive;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
601
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
602 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
603
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
604 c->uniq = fcn->uniq;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
605 c->error = fcn->error;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
606 c->node = fcn;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
607
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
608 failed:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
609
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
610 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
611
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
612 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
613 }
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
3696
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
616 static ngx_int_t
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
617 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
618 {
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
619 u_char *p;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
620 ngx_http_cache_t *c;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
621
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
622 c = r->cache;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
623
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
624 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
625 + 2 * NGX_HTTP_CACHE_KEY_LEN;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
626
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
627 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
628 if (c->file.name.data == NULL) {
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
629 return NGX_ERROR;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
630 }
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 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
633
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
634 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
635 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
636 *p = '\0';
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
637
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
638 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
639
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
640 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
641 "cache file: \"%s\"", c->file.name.data);
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
642
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
643 return NGX_OK;
29fcf794c082 ngx_http_file_cache_name()
Igor Sysoev <igor@sysoev.ru>
parents: 3695
diff changeset
644 }
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
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
647 static ngx_http_file_cache_node_t *
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
648 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
649 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
650 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
651 ngx_rbtree_key_t node_key;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
652 ngx_rbtree_node_t *node, *sentinel;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
653 ngx_http_file_cache_node_t *fcn;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
654
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
655 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
656
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
657 node = cache->sh->rbtree.root;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
658 sentinel = cache->sh->rbtree.sentinel;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
659
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
660 while (node != sentinel) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
661
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
662 if (node_key < node->key) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
663 node = node->left;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
664 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
665 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
666
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
667 if (node_key > node->key) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
668 node = node->right;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
669 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
670 }
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 /* node_key == node->key */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
673
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
674 do {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
675 fcn = (ngx_http_file_cache_node_t *) node;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
676
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
677 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
678 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
679
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
680 if (rc == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
681 return fcn;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
682 }
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 node = (rc < 0) ? node->left : node->right;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
685
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
686 } while (node != sentinel && node_key == node->key);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
687
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
688 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
689 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
690
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
691 /* not found */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
692
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
693 return NULL;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
694 }
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 static void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
698 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
699 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
700 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
701 ngx_rbtree_node_t **p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
702 ngx_http_file_cache_node_t *cn, *cnt;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
703
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
704 for ( ;; ) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
705
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
706 if (node->key < temp->key) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
707
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
708 p = &temp->left;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
709
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
710 } else if (node->key > temp->key) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
711
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
712 p = &temp->right;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
713
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
714 } else { /* node->key == temp->key */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
715
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
716 cn = (ngx_http_file_cache_node_t *) node;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
717 cnt = (ngx_http_file_cache_node_t *) temp;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
718
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
719 p = (ngx_memcmp(cn->key, cnt->key,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
720 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
721 < 0)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
722 ? &temp->left : &temp->right;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
723 }
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 if (*p == sentinel) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
726 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
727 }
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 temp = *p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
730 }
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 *p = node;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
733 node->parent = temp;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
734 node->left = sentinel;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
735 node->right = sentinel;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
736 ngx_rbt_red(node);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
737 }
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 void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
741 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
742 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
743 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
744
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
745 u_char *p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
746 ngx_str_t *key;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
747 ngx_uint_t i;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
748 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
749
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
750 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
751 "http file cache set header");
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
752
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
753 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
754
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
755 h->valid_sec = c->valid_sec;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
756 h->last_modified = c->last_modified;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
757 h->date = c->date;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
758 h->crc32 = c->crc32;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
759 h->valid_msec = (u_short) c->valid_msec;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
760 h->header_start = (u_short) c->header_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
761 h->body_start = (u_short) c->body_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
762
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
763 p = buf + sizeof(ngx_http_file_cache_header_t);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
764
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
765 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
766
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
767 key = c->keys.elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
768 for (i = 0; i < c->keys.nelts; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
769 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
770 }
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 *p = LF;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
773 }
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 void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
777 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
778 {
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
779 off_t fs_size;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
780 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
781 ngx_file_uniq_t uniq;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
782 ngx_file_info_t fi;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
783 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
784 ngx_ext_rename_file_t ext;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
785 ngx_http_file_cache_t *cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
786
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
787 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
788
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
789 if (c->updated) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
790 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
791 }
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 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
794 "http file cache update");
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
795
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
796 c->updated = 1;
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
797 c->updating = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
798
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
799 cache = c->file_cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
800
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
801 uniq = 0;
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
802 fs_size = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
803
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
804 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
805 "http file cache rename: \"%s\" to \"%s\"",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
806 tf->file.name.data, c->file.name.data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
807
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
808 ext.access = NGX_FILE_OWNER_ACCESS;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
809 ext.path_access = NGX_FILE_OWNER_ACCESS;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
810 ext.time = -1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
811 ext.create_path = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
812 ext.delete_file = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
813 ext.log = r->connection->log;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
814
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
815 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
816
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
817 if (rc == NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
818
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
819 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
820 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
821 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
822
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
823 rc = NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
824
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
825 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
826 uniq = ngx_file_uniq(&fi);
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
827 fs_size = (ngx_file_fs_size(&fi) + cache->bsize - 1) / cache->bsize;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
828 }
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 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
832
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
833 c->node->count--;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
834 c->node->uniq = uniq;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
835 c->node->body_start = c->body_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
836
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
837 cache->sh->size += fs_size - c->node->fs_size;
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
838 c->node->fs_size = fs_size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
839
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
840 if (rc == NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
841 c->node->exists = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
842 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
843
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
844 c->node->updating = 0;
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
845
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
846 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
847 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
848
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
849
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
850 ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
851 ngx_http_cache_send(ngx_http_request_t *r)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
852 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
853 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
854 ngx_buf_t *b;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
855 ngx_chain_t out;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
856 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
857
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
858 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
859
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
860 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3965
90b0487fba44 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3942
diff changeset
861 "http file cache send: %s", c->file.name.data);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
862
4150
b9ee14871bf1 Cache: fix for sending of empty responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4034
diff changeset
863 if (r != r->main && c->length - c->body_start == 0) {
b9ee14871bf1 Cache: fix for sending of empty responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4034
diff changeset
864 return ngx_http_send_header(r);
b9ee14871bf1 Cache: fix for sending of empty responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4034
diff changeset
865 }
b9ee14871bf1 Cache: fix for sending of empty responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4034
diff changeset
866
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
867 /* 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
868
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
869 b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
870 if (b == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
871 return NGX_HTTP_INTERNAL_SERVER_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
872 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
873
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
874 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
875 if (b->file == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
876 return NGX_HTTP_INTERNAL_SERVER_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
877 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
878
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
879 rc = ngx_http_send_header(r);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
880
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
881 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
882 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
883 }
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 b->file_pos = c->body_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
886 b->file_last = c->length;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
887
4150
b9ee14871bf1 Cache: fix for sending of empty responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4034
diff changeset
888 b->in_file = (c->length - c->body_start) ? 1: 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
889 b->last_buf = (r == r->main) ? 1: 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
890 b->last_in_chain = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
891
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
892 b->file->fd = c->file.fd;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
893 b->file->name = c->file.name;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
894 b->file->log = r->connection->log;
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 out.buf = b;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
897 out.next = NULL;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
898
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
899 return ngx_http_output_filter(r, &out);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
900 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
901
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 void
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
904 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
905 {
3694
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
906 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
907 ngx_http_file_cache_node_t *fcn;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
908
3917
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3899
diff changeset
909 if (c->updated || c->node == NULL) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
910 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
911 }
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 cache = c->file_cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
914
3713
f0b62d1ac7af move debug logging inside ngx_http_file_cache_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3711
diff changeset
915 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
916 "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
917
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
918 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
919
3694
dfb17155eca9 delete empty cache zone node if we could not get response to cache
Igor Sysoev <igor@sysoev.ru>
parents: 3526
diff changeset
920 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
921 fcn->count--;
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
922
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
923 if (c->updating) {
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
924 fcn->updating = 0;
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
925 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
926
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
927 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
928 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
929
3743
c469ffeab569 error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents: 3732
diff changeset
930 if (c->valid_sec) {
c469ffeab569 error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents: 3732
diff changeset
931 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
932 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
933 }
c469ffeab569 error status codes could be cached for next request only,
Igor Sysoev <igor@sysoev.ru>
parents: 3732
diff changeset
934
3723
14ad3210fc73 do not free unused cache node if cache min_uses > 1,
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
935 } 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
936 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
937 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
938 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
939 c->node = NULL;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
940 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
941
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
942 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
943
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
944 c->updated = 1;
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
945 c->updating = 0;
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
946
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
947 if (c->temp_file) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
948 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
949 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
950 "http file cache incomplete: \"%s\"",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
951 tf->file.name.data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
952
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
953 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
954 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
955 ngx_delete_file_n " \"%s\" failed",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
956 tf->file.name.data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
957 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
958 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
959 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
960 }
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 static void
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
964 ngx_http_file_cache_cleanup(void *data)
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 ngx_http_cache_t *c = data;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
967
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
968 if (c->updated) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
969 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
970 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
971
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
972 ngx_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
973 "http file cache cleanup");
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
974
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
975 if (c->updating) {
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
976 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
977 "stalled cache updating, error:%ui", c->error);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
978 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
979
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3710
diff changeset
980 ngx_http_file_cache_free(c, NULL);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
981 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
982
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
983
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
984 static time_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
985 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
986 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
987 u_char *name;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
988 size_t len;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
989 time_t wait;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
990 ngx_uint_t tries;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
991 ngx_path_t *path;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
992 ngx_queue_t *q;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
993 ngx_http_file_cache_node_t *fcn;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
994
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
995 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
996 "http file cache forced expire");
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
997
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
998 path = cache->path;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
999 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
1000
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1001 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
1002 if (name == NULL) {
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1003 return 10;
2616
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
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1006 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
1007
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1008 wait = 10;
3728
a29bb11f8c80 change logic slightly
Igor Sysoev <igor@sysoev.ru>
parents: 3727
diff changeset
1009 tries = 20;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1010
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1011 ngx_shmtx_lock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1012
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1013 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
1014 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
1015 q = ngx_queue_prev(q))
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1016 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1017 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
1018
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1019 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
1020 "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
1021 fcn->count, fcn->exists,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1022 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
1023
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1024 if (fcn->count == 0) {
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1025 ngx_http_file_cache_delete(cache, q, name);
3885
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
1026 wait = 0;
2616
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 } else {
3728
a29bb11f8c80 change logic slightly
Igor Sysoev <igor@sysoev.ru>
parents: 3727
diff changeset
1029 if (--tries) {
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1030 continue;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1031 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1032
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1033 wait = 1;
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 break;
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 ngx_shmtx_unlock(&cache->shpool->mutex);
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 ngx_free(name);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1042
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1043 return wait;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1044 }
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
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1047 static time_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1048 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
1049 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1050 u_char *name, *p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1051 size_t len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1052 time_t now, wait;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1053 ngx_path_t *path;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1054 ngx_queue_t *q;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1055 ngx_http_file_cache_node_t *fcn;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1056 u_char key[2 * NGX_HTTP_CACHE_KEY_LEN];
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1057
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1058 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
1059 "http file cache expire");
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 path = cache->path;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1062 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
1063
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1064 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
1065 if (name == NULL) {
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1066 return 10;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1067 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1068
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1069 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
1070
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1071 now = ngx_time();
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1072
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1073 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1074
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1075 for ( ;; ) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1076
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1077 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
1078 wait = 10;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1079 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1080 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1081
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1082 q = ngx_queue_last(&cache->sh->queue);
2592
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 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
1085
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1086 wait = fcn->expire - now;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1087
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1088 if (wait > 0) {
2694
49a1382b249b set cache manager maximum sleep time to 10s
Igor Sysoev <igor@sysoev.ru>
parents: 2693
diff changeset
1089 wait = wait > 10 ? 10 : wait;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1090 break;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1091 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1092
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1093 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
1094 "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
1095 fcn->count, fcn->exists,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1096 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
1097
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1098 if (fcn->count == 0) {
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1099 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
1100 continue;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1101 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1102
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1103 if (fcn->deleting) {
3942
2e8dbd773d63 fix r3756: release lock to allow other process to delete cache node
Igor Sysoev <igor@sysoev.ru>
parents: 3917
diff changeset
1104 wait = 1;
2e8dbd773d63 fix r3756: release lock to allow other process to delete cache node
Igor Sysoev <igor@sysoev.ru>
parents: 3917
diff changeset
1105 break;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1106 }
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1107
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1108 p = ngx_hex_dump(key, (u_char *) &fcn->node.key,
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1109 sizeof(ngx_rbtree_key_t));
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1110 len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1111 (void) ngx_hex_dump(p, fcn->key, len);
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1112
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1113 /*
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1114 * abnormally exited workers may leave locked cache entries,
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1115 * and although it may be safe to remove them completely,
4340
4533d7684e14 Cache: only complain on long locked entries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4339
diff changeset
1116 * we prefer to just move them to the top of the inactive queue
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1117 */
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1118
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1119 ngx_queue_remove(q);
4340
4533d7684e14 Cache: only complain on long locked entries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4339
diff changeset
1120 fcn->expire = ngx_time() + cache->inactive;
4533d7684e14 Cache: only complain on long locked entries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4339
diff changeset
1121 ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);
3727
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1122
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1123 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1124 "ignore long locked inactive cache entry %*s, count:%d",
fd2bb219de22 change order
Igor Sysoev <igor@sysoev.ru>
parents: 3726
diff changeset
1125 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
1126 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1127
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1128 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1129
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1130 ngx_free(name);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1131
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1132 return wait;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1133 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1134
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1135
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1136 static void
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1137 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
1138 u_char *name)
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1139 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1140 u_char *p;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1141 size_t len;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1142 ngx_path_t *path;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1143 ngx_http_file_cache_node_t *fcn;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1144
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1145 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
1146
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1147 if (fcn->exists) {
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
1148 cache->sh->size -= fcn->fs_size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1149
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1150 path = cache->path;
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1151 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
1152 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
1153 sizeof(ngx_rbtree_key_t));
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1154 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
1155 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
1156 *p = '\0';
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1157
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1158 fcn->count++;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1159 fcn->deleting = 1;
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1160 ngx_shmtx_unlock(&cache->shpool->mutex);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1161
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1162 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
1163 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
1164
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1165 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
1166 "http file cache expire: \"%s\"", name);
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1167
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1168 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
1169 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
1170 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
1171 }
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1172
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1173 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
1174 fcn->count--;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1175 fcn->deleting = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1176 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1177
3726
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1178 if (fcn->count == 0) {
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1179 ngx_queue_remove(q);
282ddd49f925 *) delete cache key node after a cache file removal
Igor Sysoev <igor@sysoev.ru>
parents: 3724
diff changeset
1180 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
1181 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
1182 }
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1183 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1184
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 static time_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1187 ngx_http_file_cache_manager(void *data)
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1188 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1189 ngx_http_file_cache_t *cache = data;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1190
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1191 off_t size;
3885
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
1192 time_t next, wait;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1193
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1194 next = ngx_http_file_cache_expire(cache);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1195
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1196 cache->last = ngx_current_msec;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1197 cache->files = 0;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1198
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1199 for ( ;; ) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1200 ngx_shmtx_lock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1201
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1202 size = cache->sh->size;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1203
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1204 ngx_shmtx_unlock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1205
2631
73571521c2eb add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2626
diff changeset
1206 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
73571521c2eb add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2626
diff changeset
1207 "http file cache size: %O", size);
73571521c2eb add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2626
diff changeset
1208
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1209 if (size < cache->max_size) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1210 return next;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1211 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1212
3885
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
1213 wait = ngx_http_file_cache_forced_expire(cache);
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
1214
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
1215 if (wait > 0) {
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
1216 return wait;
46938b7418c6 fix CPU hog in cache manager
Igor Sysoev <igor@sysoev.ru>
parents: 3755
diff changeset
1217 }
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1218
3972
c1a69e03bdf2 rename ngx_http_file_cache_manager_sleep() to ngx_http_file_cache_loader_sleep()
Igor Sysoev <igor@sysoev.ru>
parents: 3971
diff changeset
1219 if (ngx_quit || ngx_terminate) {
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1220 return next;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1221 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1222 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1223 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1224
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1225
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1226 static void
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1227 ngx_http_file_cache_loader(void *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_http_file_cache_t *cache = data;
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 ngx_tree_ctx_t tree;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1232
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1233 if (!cache->sh->cold || cache->sh->loading) {
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1234 return;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1235 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1236
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1237 if (!ngx_atomic_cmp_set(&cache->sh->loading, 0, ngx_pid)) {
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1238 return;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1239 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1240
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1241 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1242 "http file cache loader");
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1243
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1244 tree.init_handler = NULL;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1245 tree.file_handler = ngx_http_file_cache_manage_file;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1246 tree.pre_tree_handler = ngx_http_file_cache_noop;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1247 tree.post_tree_handler = ngx_http_file_cache_noop;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1248 tree.spec_handler = ngx_http_file_cache_delete_file;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1249 tree.data = cache;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1250 tree.alloc = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1251 tree.log = ngx_cycle->log;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1252
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1253 cache->last = ngx_current_msec;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1254 cache->files = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1255
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1256 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
1257 cache->sh->loading = 0;
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1258 return;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1259 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1260
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1261 cache->sh->cold = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1262 cache->sh->loading = 0;
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1263
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1264 ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1265 "http file cache: %V %.3fM, bsize: %uz",
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1266 &cache->path->name,
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1267 ((double) cache->sh->size * cache->bsize) / (1024 * 1024),
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1268 cache->bsize);
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1269 }
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1270
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1271
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1272 static ngx_int_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1273 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
1274 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1275 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1276 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1277
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1278
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1279 static ngx_int_t
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1280 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
1281 {
4018
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1282 ngx_msec_t elapsed;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1283 ngx_http_file_cache_t *cache;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1284
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1285 cache = ctx->data;
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 (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
1288 (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
1289 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1290
4018
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1291 if (++cache->files >= cache->loader_files) {
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1292 ngx_http_file_cache_loader_sleep(cache);
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1293
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1294 } else {
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1295 ngx_time_update();
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1296
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1297 elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last));
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1298
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1299 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1300 "http file cache loader time elapsed: %M", elapsed);
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1301
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1302 if (elapsed >= cache->loader_threshold) {
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1303 ngx_http_file_cache_loader_sleep(cache);
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1304 }
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1305 }
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1306
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1307 return (ngx_quit || ngx_terminate) ? NGX_ABORT : NGX_OK;
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1308 }
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1309
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1310
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1311 static void
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1312 ngx_http_file_cache_loader_sleep(ngx_http_file_cache_t *cache)
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1313 {
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1314 ngx_msleep(cache->loader_sleep);
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1315
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1316 ngx_time_update();
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1317
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1318 cache->last = ngx_current_msec;
5e544655d97b The change in adaptive loader behaviour introduced in r3975:
Igor Sysoev <igor@sysoev.ru>
parents: 3974
diff changeset
1319 cache->files = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1320 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1321
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1322
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1323 static ngx_int_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1324 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
1325 {
3970
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
1326 u_char *p;
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
1327 ngx_int_t n;
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
1328 ngx_uint_t i;
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
1329 ngx_http_cache_t c;
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
1330 ngx_http_file_cache_t *cache;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1331
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1332 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
1333 return NGX_ERROR;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1334 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1335
3970
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
1336 if (ctx->size < (off_t) sizeof(ngx_http_file_cache_header_t)) {
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1337 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
1338 "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
1339 return NGX_ERROR;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1340 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1341
3970
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
1342 ngx_memzero(&c, sizeof(ngx_http_cache_t));
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
1343 cache = ctx->data;
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
1344
3970
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
1345 c.length = ctx->size;
2d05952a324d elimination of reading cache files by cache loader
Igor Sysoev <igor@sysoev.ru>
parents: 3969
diff changeset
1346 c.fs_size = (ctx->fs_size + cache->bsize - 1) / cache->bsize;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1347
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1348 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
1349
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1350 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
1351 n = ngx_hextoi(p, 2);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1352
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1353 if (n == NGX_ERROR) {
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1354 return NGX_ERROR;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1355 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1356
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1357 p += 2;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1358
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1359 c.key[i] = (u_char) n;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1360 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1361
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1362 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
1363 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1364
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1365
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1366 static ngx_int_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1367 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
1368 {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1369 ngx_http_file_cache_node_t *fcn;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1370
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1371 ngx_shmtx_lock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1372
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1373 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
1374
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1375 if (fcn == NULL) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1376
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1377 fcn = ngx_slab_alloc_locked(cache->shpool,
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1378 sizeof(ngx_http_file_cache_node_t));
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1379 if (fcn == NULL) {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1380 ngx_shmtx_unlock(&cache->shpool->mutex);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1381 return NGX_ERROR;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1382 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1383
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1384 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
1385
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1386 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
1387 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
1388
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1389 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
1390
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1391 fcn->uses = 1;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1392 fcn->count = 0;
3967
83e41f6f6d96 The cache loader performs two tasks: inserting cache objects in inactivity
Igor Sysoev <igor@sysoev.ru>
parents: 3966
diff changeset
1393 fcn->valid_msec = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1394 fcn->error = 0;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1395 fcn->exists = 1;
3744
77b18d36d123 zero fcn->updating after node allocation
Igor Sysoev <igor@sysoev.ru>
parents: 3743
diff changeset
1396 fcn->updating = 0;
3755
76e3a93821b1 fix race condition if during reconfiguration two cache managers try
Igor Sysoev <igor@sysoev.ru>
parents: 3744
diff changeset
1397 fcn->deleting = 0;
3968
d7ed8b8b0cdd update the previous commit:
Igor Sysoev <igor@sysoev.ru>
parents: 3967
diff changeset
1398 fcn->uniq = 0;
3967
83e41f6f6d96 The cache loader performs two tasks: inserting cache objects in inactivity
Igor Sysoev <igor@sysoev.ru>
parents: 3966
diff changeset
1399 fcn->valid_sec = 0;
83e41f6f6d96 The cache loader performs two tasks: inserting cache objects in inactivity
Igor Sysoev <igor@sysoev.ru>
parents: 3966
diff changeset
1400 fcn->body_start = 0;
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
1401 fcn->fs_size = c->fs_size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1402
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3885
diff changeset
1403 cache->sh->size += c->fs_size;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1404
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1405 } else {
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1406 ngx_queue_remove(&fcn->queue);
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 fcn->expire = ngx_time() + cache->inactive;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1410
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
1411 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
1412
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1413 ngx_shmtx_unlock(&cache->shpool->mutex);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1414
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1415 return NGX_OK;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1416 }
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1417
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1418
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1419 static ngx_int_t
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1420 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
1421 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1422 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
1423 "http file cache delete: \"%s\"", path->data);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1424
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1425 if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1426 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
1427 ngx_delete_file_n " \"%s\" failed", path->data);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1428 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
1429
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1430 return NGX_OK;
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1431 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1432
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1433
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1434 time_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1435 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
1436 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1437 ngx_uint_t i;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1438 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
1439
2626
b0cfe5f66e8d fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents: 2616
diff changeset
1440 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
1441 return 0;
b0cfe5f66e8d fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents: 2616
diff changeset
1442 }
b0cfe5f66e8d fix segfault introduced in r2602 if there is 502/504 error
Igor Sysoev <igor@sysoev.ru>
parents: 2616
diff changeset
1443
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1444 valid = cache_valid->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1445 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
1446
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1447 if (valid[i].status == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1448 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
1449 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1450
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1451 if (valid[i].status == status) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1452 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
1453 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1454 }
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1455
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1456 return 0;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1457 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1458
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1459
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1460 char *
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1461 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
1462 {
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1463 off_t max_size;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1464 u_char *last, *p;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1465 time_t inactive;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1466 ssize_t size;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1467 ngx_str_t s, name, *value;
3974
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1468 ngx_int_t loader_files, loader_sleep, loader_threshold;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1469 ngx_uint_t i, n;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1470 ngx_http_file_cache_t *cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1471
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1472 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
1473 if (cache == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1474 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1475 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1476
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1477 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
1478 if (cache->path == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1479 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1480 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1481
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1482 inactive = 600;
3974
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1483 loader_files = 100;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1484 loader_sleep = 50;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1485 loader_threshold = 200;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1486
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1487 name.len = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1488 size = 0;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1489 max_size = NGX_MAX_OFF_T_VALUE;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1490
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1491 value = cf->args->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1492
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1493 cache->path->name = value[1];
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1494
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1495 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
1496 cache->path->name.len--;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1497 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1498
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1499 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
1500 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1501 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1502
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1503 for (i = 2; i < cf->args->nelts; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1504
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1505 if (ngx_strncmp(value[i].data, "levels=", 7) == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1506
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1507 p = value[i].data + 7;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1508 last = value[i].data + value[i].len;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1509
2671
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
1510 for (n = 0; n < 3 && p < last; n++) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1511
2671
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
1512 if (*p > '0' && *p < '3') {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1513
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1514 cache->path->level[n] = *p++ - '0';
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1515 cache->path->len += cache->path->level[n] + 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1516
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1517 if (p == last) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1518 break;
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
2671
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
1521 if (*p++ == ':' && n < 2 && p != last) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1522 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1523 }
2671
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
1524
627dee566f6c fix cache path slot
Igor Sysoev <igor@sysoev.ru>
parents: 2632
diff changeset
1525 goto invalid_levels;
2592
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1528 goto invalid_levels;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1529 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1530
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1531 if (cache->path->len < 10 + 3) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1532 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1533 }
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 invalid_levels:
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1536
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1537 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1538 "invalid \"levels\" \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1539 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1540 }
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 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
1543
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1544 name.data = value[i].data + 10;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1545
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1546 p = (u_char *) ngx_strchr(name.data, ':');
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1547
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1548 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
1549 *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
1550
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1551 name.len = p - name.data;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1552
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1553 p++;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1554
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1555 s.len = value[i].data + value[i].len - p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1556 s.data = p;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1557
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1558 size = ngx_parse_size(&s);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1559 if (size > 8191) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1560 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1561 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1562 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1563
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1564 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1565 "invalid keys zone size \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1566 return NGX_CONF_ERROR;
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1569 if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {
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 s.len = value[i].len - 9;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1572 s.data = value[i].data + 9;
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 inactive = ngx_parse_time(&s, 1);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1575 if (inactive < 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1576 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1577 "invalid inactive value \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1578 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1579 }
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 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1582 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1583
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1584 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
1585
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1586 s.len = value[i].len - 9;
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1587 s.data = value[i].data + 9;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1588
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1589 max_size = ngx_parse_offset(&s);
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1590 if (max_size < 0) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1591 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
1592 "invalid max_size value \"%V\"", &value[i]);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1593 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1594 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1595
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1596 continue;
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
3974
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1599 if (ngx_strncmp(value[i].data, "loader_files=", 13) == 0) {
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1600
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1601 loader_files = ngx_atoi(value[i].data + 13, value[i].len - 13);
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1602 if (loader_files == NGX_ERROR) {
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1603 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1604 "invalid loader_files value \"%V\"", &value[i]);
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1605 return NGX_CONF_ERROR;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1606 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1607
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1608 continue;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1609 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1610
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1611 if (ngx_strncmp(value[i].data, "loader_sleep=", 13) == 0) {
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1612
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1613 s.len = value[i].len - 13;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1614 s.data = value[i].data + 13;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1615
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1616 loader_sleep = ngx_parse_time(&s, 0);
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1617 if (loader_sleep < 0) {
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1618 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1619 "invalid loader_sleep value \"%V\"", &value[i]);
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1620 return NGX_CONF_ERROR;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1621 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1622
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1623 continue;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1624 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1625
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1626 if (ngx_strncmp(value[i].data, "loader_threshold=", 17) == 0) {
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1627
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1628 s.len = value[i].len - 17;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1629 s.data = value[i].data + 17;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1630
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1631 loader_threshold = ngx_parse_time(&s, 0);
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1632 if (loader_threshold < 0) {
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1633 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1634 "invalid loader_threshold value \"%V\"", &value[i]);
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1635 return NGX_CONF_ERROR;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1636 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1637
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1638 continue;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1639 }
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1640
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1641 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1642 "invalid parameter \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1643 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1644 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1645
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1646 if (name.len == 0 || size == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1647 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1648 "\"%V\" must have \"keys_zone\" parameter",
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1649 &cmd->name);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1650 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1651 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1652
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1653 cache->path->manager = ngx_http_file_cache_manager;
3018
8fc7b94f647b cache loader process
Igor Sysoev <igor@sysoev.ru>
parents: 3017
diff changeset
1654 cache->path->loader = ngx_http_file_cache_loader;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1655 cache->path->data = cache;
3973
9d6f21415231 set correct configuration file values while adding path
Igor Sysoev <igor@sysoev.ru>
parents: 3972
diff changeset
1656 cache->path->conf_file = cf->conf_file->file.name.data;
9d6f21415231 set correct configuration file values while adding path
Igor Sysoev <igor@sysoev.ru>
parents: 3972
diff changeset
1657 cache->path->line = cf->conf_file->line;
3974
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1658 cache->loader_files = loader_files;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1659 cache->loader_sleep = (ngx_msec_t) loader_sleep;
d10bcb07d9d4 loader_files, loader_sleep, and loader_threshold
Igor Sysoev <igor@sysoev.ru>
parents: 3973
diff changeset
1660 cache->loader_threshold = (ngx_msec_t) loader_threshold;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1661
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1662 if (ngx_add_path(cf, &cache->path) != NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1663 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1664 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1665
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1666 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
1667 if (cache->shm_zone == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1668 return NGX_CONF_ERROR;
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 if (cache->shm_zone->data) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1672 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1673 "duplicate zone \"%V\"", &name);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1674 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1675 }
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1678 cache->shm_zone->init = ngx_http_file_cache_init;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1679 cache->shm_zone->data = cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1680
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1681 cache->inactive = inactive;
2616
d19979e0d980 introduce cache manager instead of cache cleaner
Igor Sysoev <igor@sysoev.ru>
parents: 2611
diff changeset
1682 cache->max_size = max_size;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1683
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1684 return NGX_CONF_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1685 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
1686
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 469
diff changeset
1687
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1688 char *
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1689 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
1690 void *conf)
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1691 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1692 char *p = conf;
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1693
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1694 time_t valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1695 ngx_str_t *value;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1696 ngx_uint_t i, n, status;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1697 ngx_array_t **a;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1698 ngx_http_cache_valid_t *v;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1699 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
1700
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1701 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
1702
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1703 if (*a == NGX_CONF_UNSET_PTR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1704 *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
1705 if (*a == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1706 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1707 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1708 }
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1709
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1710 value = cf->args->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1711 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
1712
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1713 valid = ngx_parse_time(&value[n], 1);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1714 if (valid < 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1715 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1716 "invalid time value \"%V\"", &value[n]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1717 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
1718 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1719
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1720 if (n == 1) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1721
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1722 for (i = 0; i < 3; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1723 v = ngx_array_push(*a);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1724 if (v == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1725 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1726 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1727
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1728 v->status = statuses[i];
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1729 v->valid = valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1730 }
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 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
1733 }
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1734
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1735 for (i = 1; i < n; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1736
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1737 if (ngx_strcmp(value[i].data, "any") == 0) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1738
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1739 status = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1740
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1741 } else {
202
74994aeef848 nginx-0.0.1-2003-12-01-19:28:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1742
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1743 status = ngx_atoi(value[i].data, value[i].len);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1744 if (status < 100) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1745 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1746 "invalid status \"%V\"", &value[i]);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1747 return NGX_CONF_ERROR;
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 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1750
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1751 v = ngx_array_push(*a);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1752 if (v == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1753 return NGX_CONF_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1754 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1755
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1756 v->status = status;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1757 v->valid = valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1758 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1759
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1760 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
1761 }