Mercurial > hg > nginx-vendor-0-8
comparison src/http/ngx_http_file_cache.c @ 514:43cc6f0b77ce NGINX_0_8_9
nginx 0.8.9
*) Feature: now the start cache loader runs in a separate process; this
should improve large caches handling.
*) Feature: now temporarily files and permanent storage area may reside
at different file systems.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 17 Aug 2009 00:00:00 +0400 |
parents | f0cac61857ae |
children | 86dad910eeb6 |
comparison
equal
deleted
inserted
replaced
513:16d97d9e72b7 | 514:43cc6f0b77ce |
---|---|
51 ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data) | 51 ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data) |
52 { | 52 { |
53 ngx_http_file_cache_t *ocache = data; | 53 ngx_http_file_cache_t *ocache = data; |
54 | 54 |
55 size_t len; | 55 size_t len; |
56 ngx_uint_t n; | |
56 ngx_http_file_cache_t *cache; | 57 ngx_http_file_cache_t *cache; |
57 | 58 |
58 cache = shm_zone->data; | 59 cache = shm_zone->data; |
59 | 60 |
60 if (ocache) { | 61 if (ocache) { |
66 &ocache->path->name); | 67 &ocache->path->name); |
67 | 68 |
68 return NGX_ERROR; | 69 return NGX_ERROR; |
69 } | 70 } |
70 | 71 |
72 for (n = 0; n < 3; n++) { | |
73 if (cache->path->level[n] != ocache->path->level[n]) { | |
74 ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0, | |
75 "cache \"%V\" had previously different levels", | |
76 &shm_zone->shm.name); | |
77 return NGX_ERROR; | |
78 } | |
79 } | |
80 | |
71 cache->sh = ocache->sh; | 81 cache->sh = ocache->sh; |
72 | 82 |
73 cache->shpool = ocache->shpool; | 83 cache->shpool = ocache->shpool; |
74 cache->bsize = ocache->bsize; | 84 cache->bsize = ocache->bsize; |
75 | 85 |
76 cache->max_size /= cache->bsize; | 86 cache->max_size /= cache->bsize; |
87 | |
88 if (!cache->sh->cold || cache->sh->loading) { | |
89 cache->path->loader = NULL; | |
90 } | |
77 | 91 |
78 return NGX_OK; | 92 return NGX_OK; |
79 } | 93 } |
80 | 94 |
81 cache->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; | 95 cache->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; |
98 ngx_http_file_cache_rbtree_insert_value); | 112 ngx_http_file_cache_rbtree_insert_value); |
99 | 113 |
100 ngx_queue_init(&cache->sh->queue); | 114 ngx_queue_init(&cache->sh->queue); |
101 | 115 |
102 cache->sh->cold = 1; | 116 cache->sh->cold = 1; |
117 cache->sh->loading = 0; | |
103 cache->sh->size = 0; | 118 cache->sh->size = 0; |
104 | 119 |
105 cache->bsize = ngx_fs_bsize(cache->path->name.data); | 120 cache->bsize = ngx_fs_bsize(cache->path->name.data); |
106 | 121 |
107 cache->max_size /= cache->bsize; | 122 cache->max_size /= cache->bsize; |
633 ext.access = NGX_FILE_OWNER_ACCESS; | 648 ext.access = NGX_FILE_OWNER_ACCESS; |
634 ext.path_access = NGX_FILE_OWNER_ACCESS; | 649 ext.path_access = NGX_FILE_OWNER_ACCESS; |
635 ext.time = -1; | 650 ext.time = -1; |
636 ext.create_path = 1; | 651 ext.create_path = 1; |
637 ext.delete_file = 1; | 652 ext.delete_file = 1; |
638 ext.log_rename_error = 1; | |
639 ext.log = r->connection->log; | 653 ext.log = r->connection->log; |
640 | 654 |
641 rc = ngx_ext_rename_file(&tf->file.name, &c->file.name, &ext); | 655 rc = ngx_ext_rename_file(&tf->file.name, &c->file.name, &ext); |
642 | 656 |
643 if (rc == NGX_OK) { | 657 if (rc == NGX_OK) { |
1024 static time_t | 1038 static time_t |
1025 ngx_http_file_cache_manager(void *data) | 1039 ngx_http_file_cache_manager(void *data) |
1026 { | 1040 { |
1027 ngx_http_file_cache_t *cache = data; | 1041 ngx_http_file_cache_t *cache = data; |
1028 | 1042 |
1029 off_t size; | 1043 off_t size; |
1030 time_t next; | 1044 time_t next; |
1031 ngx_tree_ctx_t tree; | |
1032 | |
1033 if (cache->sh->cold) { | |
1034 | |
1035 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, | |
1036 "http file cache manager update"); | |
1037 | |
1038 tree.init_handler = NULL; | |
1039 tree.file_handler = ngx_http_file_cache_manage_file; | |
1040 tree.pre_tree_handler = ngx_http_file_cache_noop; | |
1041 tree.post_tree_handler = ngx_http_file_cache_noop; | |
1042 tree.spec_handler = ngx_http_file_cache_delete_file; | |
1043 tree.data = cache; | |
1044 tree.alloc = 0; | |
1045 tree.log = ngx_cycle->log; | |
1046 | |
1047 cache->last = ngx_current_msec; | |
1048 cache->files = 0; | |
1049 | |
1050 if (ngx_walk_tree(&tree, &cache->path->name) == NGX_ABORT) { | |
1051 return 10; | |
1052 } | |
1053 | |
1054 cache->sh->cold = 0; | |
1055 | |
1056 ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, | |
1057 "http file cache: %V %.3fM, bsize: %uz", | |
1058 &cache->path->name, | |
1059 ((double) cache->sh->size * cache->bsize) / (1024 * 1024), | |
1060 cache->bsize); | |
1061 } | |
1062 | 1045 |
1063 next = ngx_http_file_cache_expire(cache); | 1046 next = ngx_http_file_cache_expire(cache); |
1064 | 1047 |
1065 cache->last = ngx_current_msec; | 1048 cache->last = ngx_current_msec; |
1066 cache->files = 0; | 1049 cache->files = 0; |
1083 | 1066 |
1084 if (ngx_http_file_cache_manager_sleep(cache) != NGX_OK) { | 1067 if (ngx_http_file_cache_manager_sleep(cache) != NGX_OK) { |
1085 return next; | 1068 return next; |
1086 } | 1069 } |
1087 } | 1070 } |
1071 } | |
1072 | |
1073 | |
1074 static void | |
1075 ngx_http_file_cache_loader(void *data) | |
1076 { | |
1077 ngx_http_file_cache_t *cache = data; | |
1078 | |
1079 ngx_tree_ctx_t tree; | |
1080 | |
1081 if (!cache->sh->cold || cache->sh->loading) { | |
1082 return; | |
1083 } | |
1084 | |
1085 if (!ngx_atomic_cmp_set(&cache->sh->loading, 0, ngx_pid)) { | |
1086 return; | |
1087 } | |
1088 | |
1089 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, | |
1090 "http file cache loader"); | |
1091 | |
1092 tree.init_handler = NULL; | |
1093 tree.file_handler = ngx_http_file_cache_manage_file; | |
1094 tree.pre_tree_handler = ngx_http_file_cache_noop; | |
1095 tree.post_tree_handler = ngx_http_file_cache_noop; | |
1096 tree.spec_handler = ngx_http_file_cache_delete_file; | |
1097 tree.data = cache; | |
1098 tree.alloc = 0; | |
1099 tree.log = ngx_cycle->log; | |
1100 | |
1101 cache->last = ngx_current_msec; | |
1102 cache->files = 0; | |
1103 | |
1104 if (ngx_walk_tree(&tree, &cache->path->name) == NGX_ABORT) { | |
1105 cache->sh->loading = 0; | |
1106 return; | |
1107 } | |
1108 | |
1109 cache->sh->cold = 0; | |
1110 cache->sh->loading = 0; | |
1111 | |
1112 ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, | |
1113 "http file cache: %V %.3fM, bsize: %uz", | |
1114 &cache->path->name, | |
1115 ((double) cache->sh->size * cache->bsize) / (1024 * 1024), | |
1116 cache->bsize); | |
1088 } | 1117 } |
1089 | 1118 |
1090 | 1119 |
1091 static ngx_int_t | 1120 static ngx_int_t |
1092 ngx_http_file_cache_manager_sleep(ngx_http_file_cache_t *cache) | 1121 ngx_http_file_cache_manager_sleep(ngx_http_file_cache_t *cache) |
1466 &cmd->name); | 1495 &cmd->name); |
1467 return NGX_CONF_ERROR; | 1496 return NGX_CONF_ERROR; |
1468 } | 1497 } |
1469 | 1498 |
1470 cache->path->manager = ngx_http_file_cache_manager; | 1499 cache->path->manager = ngx_http_file_cache_manager; |
1500 cache->path->loader = ngx_http_file_cache_loader; | |
1471 cache->path->data = cache; | 1501 cache->path->data = cache; |
1472 | 1502 |
1473 if (ngx_add_path(cf, &cache->path) != NGX_OK) { | 1503 if (ngx_add_path(cf, &cache->path) != NGX_OK) { |
1474 return NGX_CONF_ERROR; | 1504 return NGX_CONF_ERROR; |
1475 } | 1505 } |