Mercurial > hg > nginx
comparison src/http/ngx_http_file_cache.c @ 3018:8fc7b94f647b
cache loader process
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 10 Aug 2009 13:27:14 +0000 |
parents | c466605d9426 |
children | 364ea8f54a2f |
comparison
equal
deleted
inserted
replaced
3017:c466605d9426 | 3018:8fc7b94f647b |
---|---|
83 cache->shpool = ocache->shpool; | 83 cache->shpool = ocache->shpool; |
84 cache->bsize = ocache->bsize; | 84 cache->bsize = ocache->bsize; |
85 | 85 |
86 cache->max_size /= cache->bsize; | 86 cache->max_size /= cache->bsize; |
87 | 87 |
88 if (!cache->sh->cold || cache->sh->loading) { | |
89 cache->path->loader = NULL; | |
90 } | |
91 | |
88 return NGX_OK; | 92 return NGX_OK; |
89 } | 93 } |
90 | 94 |
91 cache->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; | 95 cache->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; |
92 | 96 |
108 ngx_http_file_cache_rbtree_insert_value); | 112 ngx_http_file_cache_rbtree_insert_value); |
109 | 113 |
110 ngx_queue_init(&cache->sh->queue); | 114 ngx_queue_init(&cache->sh->queue); |
111 | 115 |
112 cache->sh->cold = 1; | 116 cache->sh->cold = 1; |
117 cache->sh->loading = 0; | |
113 cache->sh->size = 0; | 118 cache->sh->size = 0; |
114 | 119 |
115 cache->bsize = ngx_fs_bsize(cache->path->name.data); | 120 cache->bsize = ngx_fs_bsize(cache->path->name.data); |
116 | 121 |
117 cache->max_size /= cache->bsize; | 122 cache->max_size /= cache->bsize; |
1034 static time_t | 1039 static time_t |
1035 ngx_http_file_cache_manager(void *data) | 1040 ngx_http_file_cache_manager(void *data) |
1036 { | 1041 { |
1037 ngx_http_file_cache_t *cache = data; | 1042 ngx_http_file_cache_t *cache = data; |
1038 | 1043 |
1039 off_t size; | 1044 off_t size; |
1040 time_t next; | 1045 time_t next; |
1041 ngx_tree_ctx_t tree; | |
1042 | |
1043 if (cache->sh->cold) { | |
1044 | |
1045 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, | |
1046 "http file cache manager update"); | |
1047 | |
1048 tree.init_handler = NULL; | |
1049 tree.file_handler = ngx_http_file_cache_manage_file; | |
1050 tree.pre_tree_handler = ngx_http_file_cache_noop; | |
1051 tree.post_tree_handler = ngx_http_file_cache_noop; | |
1052 tree.spec_handler = ngx_http_file_cache_delete_file; | |
1053 tree.data = cache; | |
1054 tree.alloc = 0; | |
1055 tree.log = ngx_cycle->log; | |
1056 | |
1057 cache->last = ngx_current_msec; | |
1058 cache->files = 0; | |
1059 | |
1060 if (ngx_walk_tree(&tree, &cache->path->name) == NGX_ABORT) { | |
1061 return 10; | |
1062 } | |
1063 | |
1064 cache->sh->cold = 0; | |
1065 | |
1066 ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, | |
1067 "http file cache: %V %.3fM, bsize: %uz", | |
1068 &cache->path->name, | |
1069 ((double) cache->sh->size * cache->bsize) / (1024 * 1024), | |
1070 cache->bsize); | |
1071 } | |
1072 | 1046 |
1073 next = ngx_http_file_cache_expire(cache); | 1047 next = ngx_http_file_cache_expire(cache); |
1074 | 1048 |
1075 cache->last = ngx_current_msec; | 1049 cache->last = ngx_current_msec; |
1076 cache->files = 0; | 1050 cache->files = 0; |
1093 | 1067 |
1094 if (ngx_http_file_cache_manager_sleep(cache) != NGX_OK) { | 1068 if (ngx_http_file_cache_manager_sleep(cache) != NGX_OK) { |
1095 return next; | 1069 return next; |
1096 } | 1070 } |
1097 } | 1071 } |
1072 } | |
1073 | |
1074 | |
1075 static void | |
1076 ngx_http_file_cache_loader(void *data) | |
1077 { | |
1078 ngx_http_file_cache_t *cache = data; | |
1079 | |
1080 ngx_tree_ctx_t tree; | |
1081 | |
1082 if (!cache->sh->cold || cache->sh->loading) { | |
1083 return; | |
1084 } | |
1085 | |
1086 if (!ngx_atomic_cmp_set(&cache->sh->loading, 0, ngx_pid)) { | |
1087 return; | |
1088 } | |
1089 | |
1090 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, | |
1091 "http file cache loader"); | |
1092 | |
1093 tree.init_handler = NULL; | |
1094 tree.file_handler = ngx_http_file_cache_manage_file; | |
1095 tree.pre_tree_handler = ngx_http_file_cache_noop; | |
1096 tree.post_tree_handler = ngx_http_file_cache_noop; | |
1097 tree.spec_handler = ngx_http_file_cache_delete_file; | |
1098 tree.data = cache; | |
1099 tree.alloc = 0; | |
1100 tree.log = ngx_cycle->log; | |
1101 | |
1102 cache->last = ngx_current_msec; | |
1103 cache->files = 0; | |
1104 | |
1105 if (ngx_walk_tree(&tree, &cache->path->name) == NGX_ABORT) { | |
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); | |
1098 } | 1117 } |
1099 | 1118 |
1100 | 1119 |
1101 static ngx_int_t | 1120 static ngx_int_t |
1102 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) |
1476 &cmd->name); | 1495 &cmd->name); |
1477 return NGX_CONF_ERROR; | 1496 return NGX_CONF_ERROR; |
1478 } | 1497 } |
1479 | 1498 |
1480 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; | |
1481 cache->path->data = cache; | 1501 cache->path->data = cache; |
1482 | 1502 |
1483 if (ngx_add_path(cf, &cache->path) != NGX_OK) { | 1503 if (ngx_add_path(cf, &cache->path) != NGX_OK) { |
1484 return NGX_CONF_ERROR; | 1504 return NGX_CONF_ERROR; |
1485 } | 1505 } |