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 }