annotate src/core/ngx_open_file_cache.c @ 9230:e14debe728b0 radix_with_skip

Closed the radix_with_skip branch. The radix_with_skip branch is an archive of an experiment did in 2008, and it is no longer relevant. It is now closed to avoid cluttering of the branches list. If needed, closed branches still can be seen with "hg branches --closed".
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 23 Mar 2024 04:30:45 +0300
parents 987831d73bd8
children 225fa4abd76f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_event.h>
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 /*
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 * open file cache caches
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 * open file handles with stat() info;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 * directories stat() info;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 * files and directories errors: not found, access denied, etc.
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 static void ngx_open_file_cache_cleanup(void *data);
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
21 static ngx_int_t ngx_open_and_stat_file(u_char *name, ngx_open_file_info_t *of,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
22 ngx_log_t *log);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
23 static void ngx_open_file_add_event(ngx_open_file_cache_t *cache,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
24 ngx_cached_open_file_t *file, ngx_open_file_info_t *of, ngx_log_t *log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 static void ngx_open_file_cleanup(void *data);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 static void ngx_close_cached_file(ngx_open_file_cache_t *cache,
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
27 ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log);
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
28 static void ngx_open_file_del_event(ngx_cached_open_file_t *file);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 static void ngx_expire_old_cached_files(ngx_open_file_cache_t *cache,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 ngx_uint_t n, ngx_log_t *log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 static void ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
33 static ngx_cached_open_file_t *
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
34 ngx_open_file_lookup(ngx_open_file_cache_t *cache, ngx_str_t *name,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
35 uint32_t hash);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 static void ngx_open_file_cache_remove(ngx_event_t *ev);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 ngx_open_file_cache_t *
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 ngx_open_file_cache_init(ngx_pool_t *pool, ngx_uint_t max, time_t inactive)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 ngx_pool_cleanup_t *cln;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 ngx_open_file_cache_t *cache;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 cache = ngx_palloc(pool, sizeof(ngx_open_file_cache_t));
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 if (cache == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 return NULL;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49
1761
1c4b231ba90c embed sentinel
Igor Sysoev <igor@sysoev.ru>
parents: 1743
diff changeset
50 ngx_rbtree_init(&cache->rbtree, &cache->sentinel,
1743
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1458
diff changeset
51 ngx_open_file_cache_rbtree_insert_value);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
53 ngx_queue_init(&cache->expire_queue);
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
54
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 cache->current = 0;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 cache->max = max;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 cache->inactive = inactive;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 cln = ngx_pool_cleanup_add(pool, 0);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 if (cln == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 return NULL;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 cln->handler = ngx_open_file_cache_cleanup;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 cln->data = cache;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 return cache;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 ngx_open_file_cache_cleanup(void *data)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 ngx_open_file_cache_t *cache = data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
76 ngx_queue_t *q;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 ngx_cached_open_file_t *file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 "open file cache cleanup");
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 for ( ;; ) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
84 if (ngx_queue_empty(&cache->expire_queue)) {
1766
111eb827ed44 fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 1765
diff changeset
85 break;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
88 q = ngx_queue_last(&cache->expire_queue);
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
89
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
90 file = ngx_queue_data(q, ngx_cached_open_file_t, queue);
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
91
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
92 ngx_queue_remove(q);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 ngx_rbtree_delete(&cache->rbtree, &file->node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 cache->current--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 "delete cached open file: %s", file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 if (!file->err && !file->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 file->close = 1;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 file->count = 0;
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
104 ngx_close_cached_file(cache, file, 0, ngx_cycle->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 } else {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 ngx_free(file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 ngx_free(file);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 if (cache->current) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 "%d items still leave in open file cache",
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 cache->current);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 if (cache->rbtree.root != cache->rbtree.sentinel) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 "rbtree still is not empty in open file cache");
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 ngx_int_t
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 ngx_open_file_info_t *of, ngx_pool_t *pool)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 time_t now;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 uint32_t hash;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 ngx_int_t rc;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 ngx_pool_cleanup_t *cln;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 ngx_cached_open_file_t *file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 ngx_pool_cleanup_file_t *clnf;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 ngx_open_file_cache_cleanup_t *ofcln;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
138 of->fd = NGX_INVALID_FILE;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 of->err = 0;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 if (cache == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t));
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 if (cln == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 return NGX_ERROR;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 rc = ngx_open_and_stat_file(name->data, of, pool->log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 if (rc == NGX_OK && !of->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 cln->handler = ngx_pool_cleanup_file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 clnf = cln->data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 clnf->fd = of->fd;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 clnf->name = name->data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 clnf->log = pool->log;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 return rc;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 cln = ngx_pool_cleanup_add(pool, sizeof(ngx_open_file_cache_cleanup_t));
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 if (cln == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 return NGX_ERROR;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 now = ngx_time();
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
169 hash = ngx_crc32_long(name->data, name->len);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
170
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
171 file = ngx_open_file_lookup(cache, name, hash);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
172
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
173 if (file) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
174
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
175 file->uses++;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
176
1987
0e628cf11c29 back out the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 1986
diff changeset
177 ngx_queue_remove(&file->queue);
0e628cf11c29 back out the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 1986
diff changeset
178
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
179 if (file->fd == NGX_INVALID_FILE && file->err == 0 && !file->is_dir) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
180
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
181 /* file was not used often enough to keep open */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
182
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
183 rc = ngx_open_and_stat_file(name->data, of, pool->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
185 if (rc != NGX_OK && (of->err == 0 || !of->errors)) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
186 goto failed;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
187 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
188
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
189 goto add_event;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
192 if (file->use_event
2063
67a29af877ed initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents: 2006
diff changeset
193 || (file->event == NULL
67a29af877ed initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents: 2006
diff changeset
194 && (of->uniq == 0 || of->uniq == file->uniq)
67a29af877ed initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents: 2006
diff changeset
195 && now - file->created < of->valid))
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
196 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
197 if (file->err == 0) {
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
198
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
199 of->fd = file->fd;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
200 of->uniq = file->uniq;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
201 of->mtime = file->mtime;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
202 of->size = file->size;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
204 of->is_dir = file->is_dir;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
205 of->is_file = file->is_file;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
206 of->is_link = file->is_link;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
207 of->is_exec = file->is_exec;
2246
987831d73bd8 cache directio flag in open file cache
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
208 of->is_directio = file->is_directio;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
210 if (!file->is_dir) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
211 file->count++;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
212 ngx_open_file_add_event(cache, file, of, pool->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
215 } else {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
216 of->err = file->err;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
217 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
218
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
219 goto found;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
220 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
221
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
222 ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
223 "retest open file: %s, fd:%d, c:%d, e:%d",
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
224 file->name, file->fd, file->count, file->err);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
226 if (file->is_dir) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
227
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
228 /*
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
229 * chances that directory became file are very small
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
230 * so test_dir flag allows to use a single syscall
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
231 * in ngx_file_info() instead of three syscalls
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
232 */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
233
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
234 of->test_dir = 1;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
235 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
236
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
237 of->fd = file->fd;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
238 of->uniq = file->uniq;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
239
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
240 rc = ngx_open_and_stat_file(name->data, of, pool->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
242 if (rc != NGX_OK && (of->err == 0 || !of->errors)) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
243 goto failed;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
244 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
245
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
246 if (of->is_dir) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
247
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
248 if (file->is_dir || file->err) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
249 goto update;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
250 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
251
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
252 /* file became directory */
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
254 } else if (of->err == 0) { /* file */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
255
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
256 if (file->is_dir || file->err) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
257 goto add_event;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
258 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
260 if (of->uniq == file->uniq) {
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
262 file->count++;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
264 if (file->event) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
265 file->use_event = 1;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
268 goto renew;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
269 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
271 /* file was changed */
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
272
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
273 } else { /* error to cache */
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
275 if (file->err || file->is_dir) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
276 goto update;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
279 /* file was removed, etc. */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
280 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
281
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
282 if (file->count == 0) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
283
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
284 ngx_open_file_del_event(file);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
286 if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
287 ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
288 ngx_close_file_n " \"%s\" failed",
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
289 name->data);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
290 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
292 goto add_event;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
293 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
294
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
295 ngx_rbtree_delete(&cache->rbtree, &file->node);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
296
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
297 cache->current--;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
298
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
299 file->close = 1;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
300
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
301 goto create;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304 /* not found */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306 rc = ngx_open_and_stat_file(name->data, of, pool->log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 if (rc != NGX_OK && (of->err == 0 || !of->errors)) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309 goto failed;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 create:
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314 if (cache->current >= cache->max) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 ngx_expire_old_cached_files(cache, 0, pool->log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318 file = ngx_alloc(sizeof(ngx_cached_open_file_t), pool->log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 if (file == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321 goto failed;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324 file->name = ngx_alloc(name->len + 1, pool->log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
325
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
326 if (file->name == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327 ngx_free(file);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
328 file = NULL;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
329 goto failed;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
331
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332 ngx_cpystrn(file->name, name->data, name->len + 1);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 file->node.key = hash;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
335
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 ngx_rbtree_insert(&cache->rbtree, &file->node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 cache->current++;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
340 file->uses = 1;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
341 file->count = 0;
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
342 file->event = NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
343
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
344 add_event:
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
345
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
346 ngx_open_file_add_event(cache, file, of, pool->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
347
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
348 update:
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
349
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
350 file->fd = of->fd;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351 file->err = of->err;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
352
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353 if (of->err == 0) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
354 file->uniq = of->uniq;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355 file->mtime = of->mtime;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356 file->size = of->size;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 file->close = 0;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
359
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
360 file->is_dir = of->is_dir;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
361 file->is_file = of->is_file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
362 file->is_link = of->is_link;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
363 file->is_exec = of->is_exec;
2246
987831d73bd8 cache directio flag in open file cache
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
364 file->is_directio = of->is_directio;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366 if (!of->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
367 file->count++;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
368 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
369 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371 renew:
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373 file->created = now;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 found:
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377 file->accessed = now;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
379 ngx_queue_insert_head(&cache->expire_queue, &file->queue);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
381 ngx_log_debug5(NGX_LOG_DEBUG_CORE, pool->log, 0,
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
382 "cached open file: %s, fd:%d, c:%d, e:%d, u:%d",
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
383 file->name, file->fd, file->count, file->err, file->uses);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385 if (of->err == 0) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387 if (!of->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388 cln->handler = ngx_open_file_cleanup;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389 ofcln = cln->data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391 ofcln->cache = cache;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 ofcln->file = file;
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
393 ofcln->min_uses = of->min_uses;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 ofcln->log = pool->log;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397 return NGX_OK;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 return NGX_ERROR;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402 failed:
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403
1988
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
404 if (file) {
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
405 ngx_rbtree_delete(&cache->rbtree, &file->node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407 cache->current--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408
1988
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
409 if (file->count == 0) {
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
410
2006
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
411 if (file->fd != NGX_INVALID_FILE) {
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
412 if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
413 ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
414 ngx_close_file_n " \"%s\" failed",
1988
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
415 file->name);
2006
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
416 }
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
417 }
1988
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
418
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
419 ngx_free(file->name);
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
420 ngx_free(file);
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
421
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
422 } else {
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
423 file->close = 1;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427 if (of->fd != NGX_INVALID_FILE) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428 if (ngx_close_file(of->fd) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429 ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 ngx_close_file_n " \"%s\" failed", name->data);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
433
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 return NGX_ERROR;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 static ngx_int_t
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439 ngx_open_and_stat_file(u_char *name, ngx_open_file_info_t *of, ngx_log_t *log)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441 ngx_fd_t fd;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 ngx_file_info_t fi;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
444 if (of->fd != NGX_INVALID_FILE) {
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 if (ngx_file_info(name, &fi) == -1) {
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
447 goto failed;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
450 if (of->uniq == ngx_file_uniq(&fi)) {
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
451 goto done;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
452 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
454 } else if (of->test_dir) {
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
455
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
456 if (ngx_file_info(name, &fi) == -1) {
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
457 goto failed;
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
458 }
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
459
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
460 if (of->is_dir) {
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
461 goto done;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464
2072
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
465 if (!of->log) {
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
466 fd = ngx_open_file(name, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
467
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
468 } else {
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
469 fd = ngx_open_file(name, NGX_FILE_RDWR,
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
470 NGX_FILE_CREATE_OR_OPEN|NGX_FILE_APPEND,
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
471 NGX_FILE_DEFAULT_ACCESS);
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
472 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474 if (fd == NGX_INVALID_FILE) {
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
475 goto failed;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480 ngx_fd_info_n " \"%s\" failed", name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484 ngx_close_file_n " \"%s\" failed", name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
487 of->fd = NGX_INVALID_FILE;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
488
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489 return NGX_ERROR;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 if (ngx_is_dir(&fi)) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 ngx_close_file_n " \"%s\" failed", name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
498 of->fd = NGX_INVALID_FILE;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
499
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
500 } else {
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
501 of->fd = fd;
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
502
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
503 if (of->directio <= ngx_file_size(&fi)) {
2246
987831d73bd8 cache directio flag in open file cache
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
504 if (ngx_directio_on(fd) == -1) {
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
505 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
2246
987831d73bd8 cache directio flag in open file cache
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
506 ngx_directio_on_n " \"%s\" failed", name);
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2129
diff changeset
507
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2129
diff changeset
508 } else {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2129
diff changeset
509 of->is_directio = 1;
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
510 }
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
511 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
514 done:
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
515
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 of->uniq = ngx_file_uniq(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
517 of->mtime = ngx_file_mtime(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
518 of->size = ngx_file_size(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519 of->is_dir = ngx_is_dir(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
520 of->is_file = ngx_is_file(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
521 of->is_link = ngx_is_link(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
522 of->is_exec = ngx_is_exec(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
523
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524 return NGX_OK;
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
525
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
526 failed:
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
527
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
528 of->fd = NGX_INVALID_FILE;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
529 of->err = ngx_errno;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
530
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
531 return NGX_ERROR;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
534
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
535 /*
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
536 * we ignore any possible event setting error and
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
537 * fallback to usual periodic file retests
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
538 */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
539
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
540 static void
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
541 ngx_open_file_add_event(ngx_open_file_cache_t *cache,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
542 ngx_cached_open_file_t *file, ngx_open_file_info_t *of, ngx_log_t *log)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
543 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
544 ngx_open_file_cache_event_t *fev;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
545
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
546 if (!(ngx_event_flags & NGX_USE_VNODE_EVENT)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
547 || !of->events
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
548 || file->event
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
549 || of->fd == NGX_INVALID_FILE
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
550 || file->uses < of->min_uses)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
551 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
552 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
553 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
554
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
555 file->use_event = 0;
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
556
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
557 file->event = ngx_calloc(sizeof(ngx_event_t), log);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
558 if (file->event== NULL) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
559 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
560 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
561
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
562 fev = ngx_alloc(sizeof(ngx_open_file_cache_event_t), log);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
563 if (fev == NULL) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
564 ngx_free(file->event);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
565 file->event = NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
566 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
567 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
568
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
569 fev->fd = of->fd;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
570 fev->file = file;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
571 fev->cache = cache;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
572
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
573 file->event->handler = ngx_open_file_cache_remove;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
574 file->event->data = fev;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
575
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
576 /*
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
577 * although vnode event may be called while ngx_cycle->poll
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
578 * destruction, however, cleanup procedures are run before any
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
579 * memory freeing and events will be canceled.
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
580 */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
581
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
582 file->event->log = ngx_cycle->log;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
583
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
584 if (ngx_add_event(file->event, NGX_VNODE_EVENT, NGX_ONESHOT_EVENT)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
585 != NGX_OK)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
586 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
587 ngx_free(file->event->data);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
588 ngx_free(file->event);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
589 file->event = NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
590 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
591 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
592
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
593 /*
2071
2d216377146a fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 2070
diff changeset
594 * we do not set file->use_event here because there may be a race
2d216377146a fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 2070
diff changeset
595 * condition: a file may be deleted between opening the file and
2d216377146a fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 2070
diff changeset
596 * adding event, so we rely upon event notification only after
2d216377146a fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 2070
diff changeset
597 * one file revalidation on next file access
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
598 */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
599
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
600 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
601 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
602
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
603
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
604 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
605 ngx_open_file_cleanup(void *data)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607 ngx_open_file_cache_cleanup_t *c = data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
608
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609 c->file->count--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
611 ngx_close_cached_file(c->cache, c->file, c->min_uses, c->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613 /* drop one or two expired open files */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614 ngx_expire_old_cached_files(c->cache, 1, c->log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
617
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
618 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619 ngx_close_cached_file(ngx_open_file_cache_t *cache,
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
620 ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log)
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
621 {
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
622 ngx_log_debug5(NGX_LOG_DEBUG_CORE, log, 0,
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
623 "close cached open file: %s, fd:%d, c:%d, u:%d, %d",
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
624 file->name, file->fd, file->count, file->uses, file->close);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626 if (!file->close) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
627
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
628 file->accessed = ngx_time();
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
630 ngx_queue_remove(&file->queue);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
631
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
632 ngx_queue_insert_head(&cache->expire_queue, &file->queue);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
633
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
634 if (file->uses >= min_uses || file->count) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
635 return;
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
636 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
637 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
638
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
639 ngx_open_file_del_event(file);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
640
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
641 if (file->count) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
642 return;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
643 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
644
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
645 if (file->fd != NGX_INVALID_FILE) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
646
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
647 if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
648 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
649 ngx_close_file_n " \"%s\" failed", file->name);
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
650 }
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
651
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
652 file->fd = NGX_INVALID_FILE;
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
653 }
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
654
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
655 if (!file->close) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
656 return;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
658
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
659 ngx_free(file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660 ngx_free(file);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
661 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
662
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
664 static void
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
665 ngx_open_file_del_event(ngx_cached_open_file_t *file)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
666 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
667 if (file->event == NULL) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
668 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
669 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
670
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
671 (void) ngx_del_event(file->event, NGX_VNODE_EVENT,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
672 file->count ? NGX_FLUSH_EVENT : NGX_CLOSE_EVENT);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
673
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
674 ngx_free(file->event->data);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
675 ngx_free(file->event);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
676 file->event = NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
677 file->use_event = 0;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
678 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
679
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
680
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
681 static void
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
682 ngx_expire_old_cached_files(ngx_open_file_cache_t *cache, ngx_uint_t n,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
683 ngx_log_t *log)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
684 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
685 time_t now;
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
686 ngx_queue_t *q;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
687 ngx_cached_open_file_t *file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
688
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
689 now = ngx_time();
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
690
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
691 /*
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
692 * n == 1 deletes one or two inactive files
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
693 * n == 0 deletes least recently used file by force
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
694 * and one or two inactive files
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
695 */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
696
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
697 while (n < 3) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
698
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
699 if (ngx_queue_empty(&cache->expire_queue)) {
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
700 return;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
701 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
702
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
703 q = ngx_queue_last(&cache->expire_queue);
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
704
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
705 file = ngx_queue_data(q, ngx_cached_open_file_t, queue);
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
706
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
707 if (n++ != 0 && now - file->accessed <= cache->inactive) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
708 return;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
709 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
710
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
711 ngx_queue_remove(q);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
712
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
713 ngx_rbtree_delete(&cache->rbtree, &file->node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
714
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
715 cache->current--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
716
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
717 ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
718 "expire cached open file: %s", file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
719
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
720 if (!file->err && !file->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
721 file->close = 1;
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
722 ngx_close_cached_file(cache, file, 0, log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
723
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
724 } else {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
725 ngx_free(file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
726 ngx_free(file);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
727 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
728 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
729 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
730
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
731
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
732 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
733 ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
734 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
735 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
736 ngx_rbtree_node_t **p;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
737 ngx_cached_open_file_t *file, *file_temp;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
738
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
739 for ( ;; ) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
740
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
741 if (node->key < temp->key) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
742
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
743 p = &temp->left;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
744
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
745 } else if (node->key > temp->key) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
746
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
747 p = &temp->right;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
748
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
749 } else { /* node->key == temp->key */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
750
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
751 file = (ngx_cached_open_file_t *) node;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
752 file_temp = (ngx_cached_open_file_t *) temp;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
753
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
754 p = (ngx_strcmp(file->name, file_temp->name) < 0)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
755 ? &temp->left : &temp->right;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
756 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
757
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
758 if (*p == sentinel) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
759 break;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
760 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
761
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
762 temp = *p;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
763 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
764
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
765 *p = node;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
766 node->parent = temp;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
767 node->left = sentinel;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
768 node->right = sentinel;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
769 ngx_rbt_red(node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
770 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
771
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
772
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
773 static ngx_cached_open_file_t *
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
774 ngx_open_file_lookup(ngx_open_file_cache_t *cache, ngx_str_t *name,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
775 uint32_t hash)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
776 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
777 ngx_int_t rc;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
778 ngx_rbtree_node_t *node, *sentinel;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
779 ngx_cached_open_file_t *file;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
780
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
781 node = cache->rbtree.root;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
782 sentinel = cache->rbtree.sentinel;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
783
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
784 while (node != sentinel) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
785
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
786 if (hash < node->key) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
787 node = node->left;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
788 continue;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
789 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
790
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
791 if (hash > node->key) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
792 node = node->right;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
793 continue;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
794 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
795
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
796 /* hash == node->key */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
797
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
798 do {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
799 file = (ngx_cached_open_file_t *) node;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
800
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
801 rc = ngx_strcmp(name->data, file->name);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
802
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
803 if (rc == 0) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
804 return file;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
805 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
806
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
807 node = (rc < 0) ? node->left : node->right;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
808
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
809 } while (node != sentinel && hash == node->key);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
810
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
811 break;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
812 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
813
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
814 return NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
815 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
816
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
817
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
818 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
819 ngx_open_file_cache_remove(ngx_event_t *ev)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
820 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
821 ngx_cached_open_file_t *file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
822 ngx_open_file_cache_event_t *fev;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
823
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
824 fev = ev->data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
825 file = fev->file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
826
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
827 ngx_queue_remove(&file->queue);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
828
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
829 ngx_rbtree_delete(&fev->cache->rbtree, &file->node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
830
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
831 fev->cache->current--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
832
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
833 /* NGX_ONESHOT_EVENT was already deleted */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
834 file->event = NULL;
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
835 file->use_event = 0;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
836
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
837 file->close = 1;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
838
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
839 ngx_close_cached_file(fev->cache, file, 0, ev->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
840
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
841 /* free memory only when fev->cache and fev->file are already not needed */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
842
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
843 ngx_free(ev->data);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
844 ngx_free(ev);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
845 }