annotate src/core/ngx_open_file_cache.c @ 4005:e56c1e9873cb

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