annotate src/core/ngx_open_file_cache.c @ 4373:f41b79fa95a3

Scgi: removed error if there is no Status header. The SCGI specification doesn't specify format of the response, and assuming CGI specs should be used there is no reason to complain. RFC 3875 explicitly states that "A Status header field is optional, and status 200 'OK' is assumed if it is omitted".
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 19 Dec 2011 11:25:40 +0000
parents 31cf2902de60
children d620f497c50f
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 if (file->event) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
288 file->use_event = 1;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290
4101
31cf2902de60 Fix of the previous commit: is_directio flag processing introduced in r4077
Igor Sysoev <igor@sysoev.ru>
parents: 4100
diff changeset
291 of->is_directio = file->is_directio;
31cf2902de60 Fix of the previous commit: is_directio flag processing introduced in r4077
Igor Sysoev <igor@sysoev.ru>
parents: 4100
diff changeset
292
4100
efeee901439a Bugfix: open_file_cache did not update file info on retest.
Igor Sysoev <igor@sysoev.ru>
parents: 4076
diff changeset
293 goto update;
1775
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 file->created = now;
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 found:
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 file->accessed = now;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
403 ngx_queue_insert_head(&cache->expire_queue, &file->queue);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
405 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
406 "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
407 file->name, file->fd, file->count, file->err, file->uses);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409 if (of->err == 0) {
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->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412 cln->handler = ngx_open_file_cleanup;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 ofcln = cln->data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415 ofcln->cache = cache;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 ofcln->file = file;
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
417 ofcln->min_uses = of->min_uses;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418 ofcln->log = pool->log;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421 return NGX_OK;
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
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424 return NGX_ERROR;
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 failed:
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427
1988
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
428 if (file) {
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429 ngx_rbtree_delete(&cache->rbtree, &file->node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431 cache->current--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432
1988
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
433 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
434
2006
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
435 if (file->fd != NGX_INVALID_FILE) {
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
436 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
437 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
438 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
439 file->name);
2006
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
440 }
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
441 }
1988
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
442
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
443 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
444 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
445
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
446 } else {
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
447 file->close = 1;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 }
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 if (of->fd != NGX_INVALID_FILE) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452 if (ngx_close_file(of->fd) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453 ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454 ngx_close_file_n " \"%s\" failed", name->data);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
455 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 }
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 return NGX_ERROR;
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
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 static ngx_int_t
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 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
464 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
465 ngx_fd_t fd;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466 ngx_file_info_t fi;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
468 if (of->fd != NGX_INVALID_FILE) {
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469
2782
4bd7825fab80 uniform ngx_file_info() interface with ngx_fd_info()
Igor Sysoev <igor@sysoev.ru>
parents: 2756
diff changeset
470 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
471 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
472 goto failed;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
475 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
476 goto done;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
477 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
479 } else if (of->test_dir) {
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
480
2782
4bd7825fab80 uniform ngx_file_info() interface with ngx_fd_info()
Igor Sysoev <igor@sysoev.ru>
parents: 2756
diff changeset
481 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
482 of->failed = ngx_file_info_n;
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
483 goto failed;
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
484 }
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
485
2460
225fa4abd76f test ngx_file_info() result, the bug has been introduced in r2070
Igor Sysoev <igor@sysoev.ru>
parents: 2246
diff changeset
486 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
487 goto done;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490
2072
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
491 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
492
ac281bc4c187 use non-blocking open() not to hang on FIFO files, etc.
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
493 /*
ac281bc4c187 use non-blocking open() not to hang on FIFO files, etc.
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
494 * 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
495 * 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
496 */
ac281bc4c187 use non-blocking open() not to hang on FIFO files, etc.
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
497
ac281bc4c187 use non-blocking open() not to hang on FIFO files, etc.
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
498 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
499 NGX_FILE_OPEN, 0);
2072
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
500
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
501 } else {
2629
367b29612a00 Win32 appends synchronized if only FILE_APPEND_DATA and SYNCHRONIZE are set
Igor Sysoev <igor@sysoev.ru>
parents: 2628
diff changeset
502 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
503 NGX_FILE_DEFAULT_ACCESS);
2072
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
504 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
506 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
507 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
508 goto failed;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
509 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511 if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512 ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513 ngx_fd_info_n " \"%s\" failed", name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
517 ngx_close_file_n " \"%s\" failed", name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
518 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
520 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
521
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
522 return NGX_ERROR;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
523 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
525 if (ngx_is_dir(&fi)) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528 ngx_close_file_n " \"%s\" failed", name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
530
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
531 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
532
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
533 } else {
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
534 of->fd = fd;
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
535
3178
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
536 if (of->read_ahead && ngx_file_size(&fi) > NGX_MIN_READ_AHEAD) {
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
537 if (ngx_read_ahead(fd, of->read_ahead) == NGX_ERROR) {
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
538 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
539 ngx_read_ahead_n " \"%s\" failed", name);
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
540 }
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
541 }
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
542
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
543 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
544 if (ngx_directio_on(fd) == NGX_FILE_ERROR) {
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
545 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
546 ngx_directio_on_n " \"%s\" failed", name);
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2129
diff changeset
547
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2129
diff changeset
548 } else {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2129
diff changeset
549 of->is_directio = 1;
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
550 }
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
551 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
553
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
554 done:
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
555
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
556 of->uniq = ngx_file_uniq(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
557 of->mtime = ngx_file_mtime(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
558 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
559 of->fs_size = ngx_file_fs_size(&fi);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
560 of->is_dir = ngx_is_dir(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 of->is_file = ngx_is_file(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562 of->is_link = ngx_is_link(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
563 of->is_exec = ngx_is_exec(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
564
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
565 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
566
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
567 failed:
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 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
570 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
571
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
572 return NGX_ERROR;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
573 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
574
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
575
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
576 /*
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
577 * we ignore any possible event setting error and
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
578 * fallback to usual periodic file retests
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
579 */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
580
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
581 static void
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
582 ngx_open_file_add_event(ngx_open_file_cache_t *cache,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
583 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
584 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
585 ngx_open_file_cache_event_t *fev;
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 if (!(ngx_event_flags & NGX_USE_VNODE_EVENT)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
588 || !of->events
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
589 || file->event
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
590 || of->fd == NGX_INVALID_FILE
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
591 || file->uses < of->min_uses)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
592 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
593 return;
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
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
596 file->use_event = 0;
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
597
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
598 file->event = ngx_calloc(sizeof(ngx_event_t), log);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
599 if (file->event== NULL) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
600 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
601 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
602
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
603 fev = ngx_alloc(sizeof(ngx_open_file_cache_event_t), log);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
604 if (fev == NULL) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
605 ngx_free(file->event);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
606 file->event = NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
607 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
608 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
609
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
610 fev->fd = of->fd;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
611 fev->file = file;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
612 fev->cache = cache;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
613
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
614 file->event->handler = ngx_open_file_cache_remove;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
615 file->event->data = fev;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
616
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
617 /*
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
618 * although vnode event may be called while ngx_cycle->poll
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
619 * destruction, however, cleanup procedures are run before any
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
620 * memory freeing and events will be canceled.
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
621 */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
622
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
623 file->event->log = ngx_cycle->log;
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 if (ngx_add_event(file->event, NGX_VNODE_EVENT, NGX_ONESHOT_EVENT)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
626 != NGX_OK)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
627 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
628 ngx_free(file->event->data);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
629 ngx_free(file->event);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
630 file->event = NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
631 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
632 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
633
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
634 /*
2071
2d216377146a fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 2070
diff changeset
635 * 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
636 * condition: a file may be deleted between opening the file and
2d216377146a fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 2070
diff changeset
637 * adding event, so we rely upon event notification only after
2d216377146a fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 2070
diff changeset
638 * one file revalidation on next file access
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
639 */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
640
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
641 return;
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
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
644
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
645 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
646 ngx_open_file_cleanup(void *data)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
647 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
648 ngx_open_file_cache_cleanup_t *c = 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 c->file->count--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
651
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
652 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
653
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
654 /* drop one or two expired open files */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
655 ngx_expire_old_cached_files(c->cache, 1, c->log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
656 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
658
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
659 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660 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
661 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
662 {
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
663 ngx_log_debug5(NGX_LOG_DEBUG_CORE, log, 0,
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
664 "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
665 file->name, file->fd, file->count, file->uses, file->close);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
666
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
667 if (!file->close) {
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 file->accessed = ngx_time();
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
670
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
671 ngx_queue_remove(&file->queue);
1453
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_insert_head(&cache->expire_queue, &file->queue);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
674
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
675 if (file->uses >= min_uses || file->count) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
676 return;
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
677 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
678 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
679
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
680 ngx_open_file_del_event(file);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
681
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
682 if (file->count) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
683 return;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
684 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
685
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
686 if (file->fd != NGX_INVALID_FILE) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
687
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
688 if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
689 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
690 ngx_close_file_n " \"%s\" failed", file->name);
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
691 }
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
692
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
693 file->fd = NGX_INVALID_FILE;
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
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
696 if (!file->close) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
697 return;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
698 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
699
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
700 ngx_free(file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
701 ngx_free(file);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
702 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
703
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 static void
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
706 ngx_open_file_del_event(ngx_cached_open_file_t *file)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
707 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
708 if (file->event == NULL) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
709 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
710 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
711
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
712 (void) ngx_del_event(file->event, NGX_VNODE_EVENT,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
713 file->count ? NGX_FLUSH_EVENT : NGX_CLOSE_EVENT);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
714
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
715 ngx_free(file->event->data);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
716 ngx_free(file->event);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
717 file->event = NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
718 file->use_event = 0;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
719 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
720
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 static void
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
723 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
724 ngx_log_t *log)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
725 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
726 time_t now;
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
727 ngx_queue_t *q;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
728 ngx_cached_open_file_t *file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
729
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
730 now = ngx_time();
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 /*
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
733 * n == 1 deletes one or two inactive files
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
734 * n == 0 deletes least recently used file by force
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
735 * and one or two inactive files
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
736 */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
737
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
738 while (n < 3) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
739
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
740 if (ngx_queue_empty(&cache->expire_queue)) {
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
741 return;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
742 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
743
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
744 q = ngx_queue_last(&cache->expire_queue);
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
745
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
746 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
747
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
748 if (n++ != 0 && now - file->accessed <= cache->inactive) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
749 return;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
750 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
751
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
752 ngx_queue_remove(q);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
753
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
754 ngx_rbtree_delete(&cache->rbtree, &file->node);
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 cache->current--;
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 ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
759 "expire cached open file: %s", file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
760
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
761 if (!file->err && !file->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
762 file->close = 1;
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
763 ngx_close_cached_file(cache, file, 0, log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
764
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
765 } else {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
766 ngx_free(file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
767 ngx_free(file);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
768 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
769 }
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 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
774 ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
775 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
776 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
777 ngx_rbtree_node_t **p;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
778 ngx_cached_open_file_t *file, *file_temp;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
779
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
780 for ( ;; ) {
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 if (node->key < temp->key) {
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 p = &temp->left;
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 } else if (node->key > temp->key) {
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 p = &temp->right;
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 } else { /* node->key == temp->key */
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 file = (ngx_cached_open_file_t *) node;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
793 file_temp = (ngx_cached_open_file_t *) temp;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
794
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
795 p = (ngx_strcmp(file->name, file_temp->name) < 0)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
796 ? &temp->left : &temp->right;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
797 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
798
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
799 if (*p == sentinel) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
800 break;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
801 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
802
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
803 temp = *p;
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
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
806 *p = node;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
807 node->parent = temp;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
808 node->left = sentinel;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
809 node->right = sentinel;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
810 ngx_rbt_red(node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
811 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
812
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
813
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
814 static ngx_cached_open_file_t *
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
815 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
816 uint32_t hash)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
817 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
818 ngx_int_t rc;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
819 ngx_rbtree_node_t *node, *sentinel;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
820 ngx_cached_open_file_t *file;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
821
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
822 node = cache->rbtree.root;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
823 sentinel = cache->rbtree.sentinel;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
824
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
825 while (node != 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 if (hash < node->key) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
828 node = node->left;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
829 continue;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
830 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
831
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
832 if (hash > node->key) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
833 node = node->right;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
834 continue;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
835 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
836
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
837 /* hash == node->key */
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 do {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
840 file = (ngx_cached_open_file_t *) node;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
841
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
842 rc = ngx_strcmp(name->data, file->name);
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 if (rc == 0) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
845 return file;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
846 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
847
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
848 node = (rc < 0) ? node->left : node->right;
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 } while (node != sentinel && hash == node->key);
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 break;
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
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
855 return NULL;
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
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
858
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
859 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
860 ngx_open_file_cache_remove(ngx_event_t *ev)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
861 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
862 ngx_cached_open_file_t *file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
863 ngx_open_file_cache_event_t *fev;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
864
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
865 fev = ev->data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
866 file = fev->file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
867
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
868 ngx_queue_remove(&file->queue);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
869
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
870 ngx_rbtree_delete(&fev->cache->rbtree, &file->node);
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 fev->cache->current--;
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 /* NGX_ONESHOT_EVENT was already deleted */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
875 file->event = NULL;
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
876 file->use_event = 0;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
877
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
878 file->close = 1;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
879
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
880 ngx_close_cached_file(fev->cache, file, 0, ev->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
881
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
882 /* 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
883
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
884 ngx_free(ev->data);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
885 ngx_free(ev);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
886 }