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 }