16 static void ngx_http_file_cache_lock_wait_handler(
ngx_event_t *ev);
21 #if (NGX_HAVE_FILE_AIO)
22 static void ngx_http_cache_aio_event_handler(
ngx_event_t *ev);
32 static void ngx_http_file_cache_cleanup(
void *data);
60 static u_char ngx_http_file_cache_key[] = {
LF,
'K',
'E',
'Y',
':',
' ' };
72 cache = shm_zone->
data;
77 "cache \"%V\" uses the \"%V\" cache path "
78 "while previously it used the \"%V\" cache path",
85 for (n = 0; n < 3; n++) {
88 "cache \"%V\" had previously different levels",
94 cache->
sh = ocache->
sh;
118 if (cache->
sh == NULL) {
125 ngx_http_file_cache_rbtree_insert_value);
137 len =
sizeof(
" in cache keys zone \"\"") + shm_zone->
shm.
name.
len;
188 cln->
handler = ngx_http_file_cache_cleanup;
191 if (ngx_http_file_cache_exists(cache, c) ==
NGX_ERROR) {
195 if (ngx_http_file_cache_name(r, cache->
path) !=
NGX_OK) {
222 "http cache key: \"%V\"", &key[i]);
231 +
sizeof(ngx_http_file_cache_key) + len + 1;
256 return ngx_http_file_cache_read(r, c);
261 if (c->
node == NULL) {
267 cln->
handler = ngx_http_file_cache_cleanup;
271 rc = ngx_http_file_cache_exists(cache, c);
274 "http file cache exists: %i e:%d", rc, c->
exists);
314 if (ngx_http_file_cache_name(r, cache->
path) !=
NGX_OK) {
353 "http file cache fd: %d", of.
fd);
362 if (c->
buf == NULL) {
366 return ngx_http_file_cache_read(r, c);
371 return ngx_http_file_cache_lock(r, c);
400 "http file cache lock u:%d wt:%M",
430 ngx_http_file_cache_lock_wait_handler(
ngx_event_t *ev)
442 "http file cache wait handler wt:%M cur:%M",
449 "http file cache lock timeout");
487 n = ngx_http_file_cache_aio_read(r, c);
493 if ((
size_t) n < c->header_start) {
503 "cache file \"%s\" has md5 collision", c->
file.
name.
data);
509 "cache file \"%s\" has too long header",
562 "http file cache expired: %i %T %T",
575 #if (NGX_HAVE_FILE_AIO)
595 c->
file.aio->data = r;
596 c->
file.aio->handler = ngx_http_cache_aio_event_handler;
611 #if (NGX_HAVE_FILE_AIO)
642 fcn = ngx_http_file_cache_lookup(cache, c->
key);
648 if (c->
node == NULL) {
686 (void) ngx_http_file_cache_forced_expire(cache);
788 while (node != sentinel) {
790 if (node_key < node->key) {
795 if (node_key > node->
key) {
811 node = (rc < 0) ? node->
left : node->
right;
829 if (node->
key < temp->
key) {
833 }
else if (node->
key > temp->
key) {
848 if (*p == sentinel) {
857 node->
left = sentinel;
858 node->
right = sentinel;
874 "http file cache set header");
888 p =
ngx_cpymem(p, ngx_http_file_cache_key,
sizeof(ngx_http_file_cache_key));
892 p =
ngx_copy(p, key[i].data, key[i].len);
917 "http file cache update");
928 "http file cache rename: \"%s\" to \"%s\"",
998 if (b->
file == NULL) {
1039 "http file cache free, fd: %d", c->
file.
fd);
1073 "http file cache incomplete: \"%s\"",
1091 ngx_http_file_cache_cleanup(
void *data)
1100 "http file cache cleanup");
1104 "stalled cache updating, error:%ui", c->
error);
1123 "http file cache forced expire");
1147 "http file cache forced expire: #%d %d %02xd%02xd%02xd%02xd",
1151 if (fcn->
count == 0) {
1152 ngx_http_file_cache_delete(cache, q, name);
1186 "http file cache expire");
1213 wait = fcn->
expire - now;
1216 wait = wait > 10 ? 10 : wait;
1221 "http file cache expire: #%d %d %02xd%02xd%02xd%02xd",
1225 if (fcn->
count == 0) {
1226 ngx_http_file_cache_delete(cache, q, name);
1251 "ignore long locked inactive cache entry %*s, count:%d",
1293 "http file cache expire: \"%s\"", name);
1305 if (fcn->
count == 0) {
1314 ngx_http_file_cache_manager(
void *data)
1321 next = ngx_http_file_cache_expire(cache);
1334 "http file cache size: %O", size);
1336 if (size < cache->max_size) {
1340 wait = ngx_http_file_cache_forced_expire(cache);
1354 ngx_http_file_cache_loader(
void *data)
1369 "http file cache loader");
1392 "http file cache: %V %.3fM, bsize: %uz",
1394 ((
double) cache->
sh->
size * cache->
bsize) / (1024 * 1024),
1414 if (ngx_http_file_cache_add_file(ctx, path) !=
NGX_OK) {
1415 (void) ngx_http_file_cache_delete_file(ctx, path);
1419 ngx_http_file_cache_loader_sleep(cache);
1427 "http file cache loader time elapsed: %M", elapsed);
1430 ngx_http_file_cache_loader_sleep(cache);
1465 "cache file \"%s\" is too small", name->
data);
1486 c.
key[
i] = (u_char) n;
1489 return ngx_http_file_cache_add(cache, &c);
1500 fcn = ngx_http_file_cache_lookup(cache, c->
key);
1550 "http file cache delete: \"%s\"", path->
data);
1567 if (cache_valid == NULL) {
1571 valid = cache_valid->
elts;
1572 for (i = 0; i < cache_valid->
nelts; i++) {
1574 if (valid[i].status == 0) {
1578 if (valid[i].status == status) {
1601 if (cache == NULL) {
1606 if (cache->
path == NULL) {
1613 loader_threshold = 200;
1633 if (
ngx_strncmp(value[i].data,
"levels=", 7) == 0) {
1635 p = value[
i].
data + 7;
1638 for (n = 0; n < 3 && p < last; n++) {
1640 if (*p >
'0' && *p <
'3') {
1649 if (*p++ ==
':' && n < 2 && p != last) {
1653 goto invalid_levels;
1656 goto invalid_levels;
1659 if (cache->
path->
len < 10 + 3) {
1666 "invalid \"levels\" \"%V\"", &value[i]);
1670 if (
ngx_strncmp(value[i].data,
"keys_zone=", 10) == 0) {
1691 "invalid keys zone size \"%V\"", &value[i]);
1695 if (
ngx_strncmp(value[i].data,
"inactive=", 9) == 0) {
1703 "invalid inactive value \"%V\"", &value[i]);
1710 if (
ngx_strncmp(value[i].data,
"max_size=", 9) == 0) {
1718 "invalid max_size value \"%V\"", &value[i]);
1725 if (
ngx_strncmp(value[i].data,
"loader_files=", 13) == 0) {
1727 loader_files =
ngx_atoi(value[i].data + 13, value[i].len - 13);
1730 "invalid loader_files value \"%V\"", &value[i]);
1737 if (
ngx_strncmp(value[i].data,
"loader_sleep=", 13) == 0) {
1745 "invalid loader_sleep value \"%V\"", &value[i]);
1752 if (
ngx_strncmp(value[i].data,
"loader_threshold=", 17) == 0) {
1760 "invalid loader_threshold value \"%V\"", &value[i]);
1768 "invalid parameter \"%V\"", &value[i]);
1772 if (name.
len == 0 || size == 0) {
1774 "\"%V\" must have \"keys_zone\" parameter",
1779 cache->
path->
manager = ngx_http_file_cache_manager;
1780 cache->
path->
loader = ngx_http_file_cache_loader;
1799 "duplicate zone \"%V\"", &name);
1825 static ngx_uint_t statuses[] = { 200, 301, 302 };
1842 "invalid time value \"%V\"", &value[n]);
1848 for (i = 0; i < 3; i++) {
1861 for (i = 1; i < n; i++) {
1869 status =
ngx_atoi(value[i].data, value[i].len);
1872 "invalid status \"%V\"", &value[i]);