Mercurial > hg > nginx-quic
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 } |