comparison src/http/ngx_http_file_cache.c @ 3247:1f3cd08ebb82 stable-0.7

merge r3017, r3018, r3019, r3020, r3021, r3022, r3023, r3196: cache management fixes: *) separate cache loader process *) use real file cache length, this fixes cache size counting for responses without "Content-Length" header and 304 responses.
author Igor Sysoev <igor@sysoev.ru>
date Mon, 26 Oct 2009 17:23:49 +0000
parents 4f28e63e42b4
children 8c76116820f3
comparison
equal deleted inserted replaced
3246:eb555a9a57d4 3247:1f3cd08ebb82
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;
601 616
602 617
603 void 618 void
604 ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf) 619 ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf)
605 { 620 {
606 off_t size; 621 off_t size, length;
607 ngx_int_t rc; 622 ngx_int_t rc;
608 ngx_file_uniq_t uniq; 623 ngx_file_uniq_t uniq;
609 ngx_file_info_t fi; 624 ngx_file_info_t fi;
610 ngx_http_cache_t *c; 625 ngx_http_cache_t *c;
611 ngx_ext_rename_file_t ext; 626 ngx_ext_rename_file_t ext;
623 c->updated = 1; 638 c->updated = 1;
624 639
625 cache = c->file_cache; 640 cache = c->file_cache;
626 641
627 uniq = 0; 642 uniq = 0;
643 length = 0;
628 644
629 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, 645 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
630 "http file cache rename: \"%s\" to \"%s\"", 646 "http file cache rename: \"%s\" to \"%s\"",
631 tf->file.name.data, c->file.name.data); 647 tf->file.name.data, c->file.name.data);
632 648
648 664
649 rc = NGX_ERROR; 665 rc = NGX_ERROR;
650 666
651 } else { 667 } else {
652 uniq = ngx_file_uniq(&fi); 668 uniq = ngx_file_uniq(&fi);
653 } 669 length = ngx_file_size(&fi);
654 } 670 }
655 671 }
656 size = (c->length + cache->bsize - 1) / cache->bsize; 672
673 size = (length + cache->bsize - 1) / cache->bsize;
657 674
658 ngx_shmtx_lock(&cache->shpool->mutex); 675 ngx_shmtx_lock(&cache->shpool->mutex);
659 676
660 c->node->count--; 677 c->node->count--;
661 c->node->uniq = uniq; 678 c->node->uniq = uniq;
662 c->node->body_start = c->body_start; 679 c->node->body_start = c->body_start;
663 680
664 size = size - (c->node->length + cache->bsize - 1) / cache->bsize; 681 size = size - (c->node->length + cache->bsize - 1) / cache->bsize;
665 682
666 c->node->length = c->length; 683 c->node->length = length;
667 684
668 cache->sh->size += size; 685 cache->sh->size += size;
669 686
670 if (rc == NGX_OK) { 687 if (rc == NGX_OK) {
671 c->node->exists = 1; 688 c->node->exists = 1;
1024 static time_t 1041 static time_t
1025 ngx_http_file_cache_manager(void *data) 1042 ngx_http_file_cache_manager(void *data)
1026 { 1043 {
1027 ngx_http_file_cache_t *cache = data; 1044 ngx_http_file_cache_t *cache = data;
1028 1045
1029 off_t size; 1046 off_t size;
1030 time_t next; 1047 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 1048
1063 next = ngx_http_file_cache_expire(cache); 1049 next = ngx_http_file_cache_expire(cache);
1064 1050
1065 cache->last = ngx_current_msec; 1051 cache->last = ngx_current_msec;
1066 cache->files = 0; 1052 cache->files = 0;
1083 1069
1084 if (ngx_http_file_cache_manager_sleep(cache) != NGX_OK) { 1070 if (ngx_http_file_cache_manager_sleep(cache) != NGX_OK) {
1085 return next; 1071 return next;
1086 } 1072 }
1087 } 1073 }
1074 }
1075
1076
1077 static void
1078 ngx_http_file_cache_loader(void *data)
1079 {
1080 ngx_http_file_cache_t *cache = data;
1081
1082 ngx_tree_ctx_t tree;
1083
1084 if (!cache->sh->cold || cache->sh->loading) {
1085 return;
1086 }
1087
1088 if (!ngx_atomic_cmp_set(&cache->sh->loading, 0, ngx_pid)) {
1089 return;
1090 }
1091
1092 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
1093 "http file cache loader");
1094
1095 tree.init_handler = NULL;
1096 tree.file_handler = ngx_http_file_cache_manage_file;
1097 tree.pre_tree_handler = ngx_http_file_cache_noop;
1098 tree.post_tree_handler = ngx_http_file_cache_noop;
1099 tree.spec_handler = ngx_http_file_cache_delete_file;
1100 tree.data = cache;
1101 tree.alloc = 0;
1102 tree.log = ngx_cycle->log;
1103
1104 cache->last = ngx_current_msec;
1105 cache->files = 0;
1106
1107 if (ngx_walk_tree(&tree, &cache->path->name) == NGX_ABORT) {
1108 cache->sh->loading = 0;
1109 return;
1110 }
1111
1112 cache->sh->cold = 0;
1113 cache->sh->loading = 0;
1114
1115 ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,
1116 "http file cache: %V %.3fM, bsize: %uz",
1117 &cache->path->name,
1118 ((double) cache->sh->size * cache->bsize) / (1024 * 1024),
1119 cache->bsize);
1088 } 1120 }
1089 1121
1090 1122
1091 static ngx_int_t 1123 static ngx_int_t
1092 ngx_http_file_cache_manager_sleep(ngx_http_file_cache_t *cache) 1124 ngx_http_file_cache_manager_sleep(ngx_http_file_cache_t *cache)
1466 &cmd->name); 1498 &cmd->name);
1467 return NGX_CONF_ERROR; 1499 return NGX_CONF_ERROR;
1468 } 1500 }
1469 1501
1470 cache->path->manager = ngx_http_file_cache_manager; 1502 cache->path->manager = ngx_http_file_cache_manager;
1503 cache->path->loader = ngx_http_file_cache_loader;
1471 cache->path->data = cache; 1504 cache->path->data = cache;
1472 1505
1473 if (ngx_add_path(cf, &cache->path) != NGX_OK) { 1506 if (ngx_add_path(cf, &cache->path) != NGX_OK) {
1474 return NGX_CONF_ERROR; 1507 return NGX_CONF_ERROR;
1475 } 1508 }