Mercurial > hg > nginx
comparison src/core/ngx_open_file_cache.c @ 1772:25c93614e6b9
open_file_cache_min_uses
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sat, 22 Dec 2007 13:19:39 +0000 |
parents | c42431762903 |
children | 108576aef610 |
comparison
equal
deleted
inserted
replaced
1771:b794d78e52c5 | 1772:25c93614e6b9 |
---|---|
18 | 18 |
19 | 19 |
20 static void ngx_open_file_cache_cleanup(void *data); | 20 static void ngx_open_file_cache_cleanup(void *data); |
21 static void ngx_open_file_cleanup(void *data); | 21 static void ngx_open_file_cleanup(void *data); |
22 static void ngx_close_cached_file(ngx_open_file_cache_t *cache, | 22 static void ngx_close_cached_file(ngx_open_file_cache_t *cache, |
23 ngx_cached_open_file_t *file, ngx_log_t *log); | 23 ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log); |
24 static ngx_int_t ngx_open_and_stat_file(u_char *name, ngx_open_file_info_t *of, | 24 static ngx_int_t ngx_open_and_stat_file(u_char *name, ngx_open_file_info_t *of, |
25 ngx_log_t *log); | 25 ngx_log_t *log); |
26 static void ngx_expire_old_cached_files(ngx_open_file_cache_t *cache, | 26 static void ngx_expire_old_cached_files(ngx_open_file_cache_t *cache, |
27 ngx_uint_t n, ngx_log_t *log); | 27 ngx_uint_t n, ngx_log_t *log); |
28 static void ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp, | 28 static void ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp, |
93 "delete cached open file: %s", file->name); | 93 "delete cached open file: %s", file->name); |
94 | 94 |
95 if (!file->err && !file->is_dir) { | 95 if (!file->err && !file->is_dir) { |
96 file->close = 1; | 96 file->close = 1; |
97 file->count = 0; | 97 file->count = 0; |
98 ngx_close_cached_file(cache, file, ngx_cycle->log); | 98 ngx_close_cached_file(cache, file, 0, ngx_cycle->log); |
99 | 99 |
100 } else { | 100 } else { |
101 ngx_free(file->name); | 101 ngx_free(file->name); |
102 ngx_free(file); | 102 ngx_free(file); |
103 } | 103 } |
185 | 185 |
186 rc = ngx_strcmp(name->data, file->name); | 186 rc = ngx_strcmp(name->data, file->name); |
187 | 187 |
188 if (rc == 0) { | 188 if (rc == 0) { |
189 | 189 |
190 file->uses++; | |
191 | |
190 ngx_queue_remove(&file->queue); | 192 ngx_queue_remove(&file->queue); |
191 | 193 |
194 if (file->fd == NGX_INVALID_FILE | |
195 && file->err == 0 | |
196 && !file->is_dir) | |
197 { | |
198 /* file was not used often enough to be open */ | |
199 | |
200 rc = ngx_open_and_stat_file(name->data, of, pool->log); | |
201 | |
202 if (rc != NGX_OK && (of->err == 0 || !of->errors)) { | |
203 goto failed; | |
204 } | |
205 | |
206 goto update; | |
207 } | |
208 | |
192 if (file->event || now - file->created < of->valid) { | 209 if (file->event || now - file->created < of->valid) { |
210 | |
193 if (file->err == 0) { | 211 if (file->err == 0) { |
212 | |
194 of->fd = file->fd; | 213 of->fd = file->fd; |
195 of->uniq = file->uniq; | 214 of->uniq = file->uniq; |
196 of->mtime = file->mtime; | 215 of->mtime = file->mtime; |
197 of->size = file->size; | 216 of->size = file->size; |
198 | 217 |
336 ngx_rbtree_insert(&cache->rbtree, &file->node); | 355 ngx_rbtree_insert(&cache->rbtree, &file->node); |
337 | 356 |
338 cache->current++; | 357 cache->current++; |
339 | 358 |
340 file->count = 0; | 359 file->count = 0; |
360 file->uses = 1; | |
341 | 361 |
342 update: | 362 update: |
343 | 363 |
344 if (of->events | 364 if (of->events |
345 && (ngx_event_flags & NGX_USE_VNODE_EVENT) | 365 && (ngx_event_flags & NGX_USE_VNODE_EVENT) |
410 | 430 |
411 file->accessed = now; | 431 file->accessed = now; |
412 | 432 |
413 ngx_queue_insert_head(&cache->expire_queue, &file->queue); | 433 ngx_queue_insert_head(&cache->expire_queue, &file->queue); |
414 | 434 |
415 ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0, | 435 ngx_log_debug5(NGX_LOG_DEBUG_CORE, pool->log, 0, |
416 "cached open file: %s, fd:%d, c:%d, e:%d", | 436 "cached open file: %s, fd:%d, c:%d, e:%d, u:%d", |
417 file->name, file->fd, file->count, file->err); | 437 file->name, file->fd, file->count, file->err, file->uses); |
418 | 438 |
419 if (of->err == 0) { | 439 if (of->err == 0) { |
420 | 440 |
421 if (!of->is_dir) { | 441 if (!of->is_dir) { |
422 cln->handler = ngx_open_file_cleanup; | 442 cln->handler = ngx_open_file_cleanup; |
423 ofcln = cln->data; | 443 ofcln = cln->data; |
424 | 444 |
425 ofcln->cache = cache; | 445 ofcln->cache = cache; |
426 ofcln->file = file; | 446 ofcln->file = file; |
447 ofcln->min_uses = of->min_uses; | |
427 ofcln->log = pool->log; | 448 ofcln->log = pool->log; |
428 } | 449 } |
429 | 450 |
430 return NGX_OK; | 451 return NGX_OK; |
431 } | 452 } |
534 { | 555 { |
535 ngx_open_file_cache_cleanup_t *c = data; | 556 ngx_open_file_cache_cleanup_t *c = data; |
536 | 557 |
537 c->file->count--; | 558 c->file->count--; |
538 | 559 |
539 ngx_close_cached_file(c->cache, c->file, c->log); | 560 ngx_close_cached_file(c->cache, c->file, c->min_uses, c->log); |
540 | 561 |
541 /* drop one or two expired open files */ | 562 /* drop one or two expired open files */ |
542 ngx_expire_old_cached_files(c->cache, 1, c->log); | 563 ngx_expire_old_cached_files(c->cache, 1, c->log); |
543 } | 564 } |
544 | 565 |
545 | 566 |
546 static void | 567 static void |
547 ngx_close_cached_file(ngx_open_file_cache_t *cache, | 568 ngx_close_cached_file(ngx_open_file_cache_t *cache, |
548 ngx_cached_open_file_t *file, ngx_log_t *log) | 569 ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log) |
549 { | 570 { |
550 ngx_log_debug4(NGX_LOG_DEBUG_CORE, log, 0, | 571 ngx_log_debug5(NGX_LOG_DEBUG_CORE, log, 0, |
551 "close cached open file: %s, fd:%d, c:%d, %d", | 572 "close cached open file: %s, fd:%d, c:%d, u:%d, %d", |
552 file->name, file->fd, file->count, file->close); | 573 file->name, file->fd, file->count, file->uses, file->close); |
553 | 574 |
554 if (!file->close) { | 575 if (!file->close) { |
555 | 576 |
556 file->accessed = ngx_time(); | 577 file->accessed = ngx_time(); |
557 | 578 |
558 ngx_queue_remove(&file->queue); | 579 ngx_queue_remove(&file->queue); |
559 | 580 |
560 ngx_queue_insert_head(&cache->expire_queue, &file->queue); | 581 ngx_queue_insert_head(&cache->expire_queue, &file->queue); |
561 | 582 |
562 return; | 583 if (file->uses >= min_uses || file->count) { |
584 return; | |
585 } | |
563 } | 586 } |
564 | 587 |
565 if (file->event) { | 588 if (file->event) { |
566 (void) ngx_del_event(file->event, NGX_VNODE_EVENT, | 589 (void) ngx_del_event(file->event, NGX_VNODE_EVENT, |
567 file->count ? NGX_FLUSH_EVENT : NGX_CLOSE_EVENT); | 590 file->count ? NGX_FLUSH_EVENT : NGX_CLOSE_EVENT); |
573 | 596 |
574 if (file->count) { | 597 if (file->count) { |
575 return; | 598 return; |
576 } | 599 } |
577 | 600 |
578 if (ngx_close_file(file->fd) == NGX_FILE_ERROR) { | 601 if (file->fd != NGX_INVALID_FILE) { |
579 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | 602 |
580 ngx_close_file_n " \"%s\" failed", file->name); | 603 if (ngx_close_file(file->fd) == NGX_FILE_ERROR) { |
604 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | |
605 ngx_close_file_n " \"%s\" failed", file->name); | |
606 } | |
607 | |
608 file->fd = NGX_INVALID_FILE; | |
609 } | |
610 | |
611 if (!file->close) { | |
612 return; | |
581 } | 613 } |
582 | 614 |
583 ngx_free(file->name); | 615 ngx_free(file->name); |
584 ngx_free(file); | 616 ngx_free(file); |
585 } | 617 } |
624 ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, | 656 ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, |
625 "expire cached open file: %s", file->name); | 657 "expire cached open file: %s", file->name); |
626 | 658 |
627 if (!file->err && !file->is_dir) { | 659 if (!file->err && !file->is_dir) { |
628 file->close = 1; | 660 file->close = 1; |
629 ngx_close_cached_file(cache, file, log); | 661 ngx_close_cached_file(cache, file, 0, log); |
630 | 662 |
631 } else { | 663 } else { |
632 ngx_free(file->name); | 664 ngx_free(file->name); |
633 ngx_free(file); | 665 ngx_free(file); |
634 } | 666 } |
695 /* NGX_ONESHOT_EVENT was already deleted */ | 727 /* NGX_ONESHOT_EVENT was already deleted */ |
696 file->event = NULL; | 728 file->event = NULL; |
697 | 729 |
698 file->close = 1; | 730 file->close = 1; |
699 | 731 |
700 ngx_close_cached_file(fev->cache, file, ev->log); | 732 ngx_close_cached_file(fev->cache, file, 0, ev->log); |
701 | 733 |
702 /* free memory only when fev->cache and fev->file are already not needed */ | 734 /* free memory only when fev->cache and fev->file are already not needed */ |
703 | 735 |
704 ngx_free(ev->data); | 736 ngx_free(ev->data); |
705 ngx_free(ev); | 737 ngx_free(ev); |