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);