changeset 3899:e7cd13b7f759

Use more precise stat.st_blocks to account cache size on Unix instead of file length rounded to a file system block size. There is no similar way on Windows, so rounding to a cache->bsize is kept.
author Igor Sysoev <igor@sysoev.ru>
date Fri, 22 Apr 2011 10:06:43 +0000
parents bd1222fb0192
children 4d5754e2f220
files src/core/ngx_open_file_cache.c src/core/ngx_open_file_cache.h src/http/ngx_http_cache.h src/http/ngx_http_file_cache.c src/os/unix/ngx_files.h src/os/win32/ngx_files.h
diffstat 6 files changed, 21 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/ngx_open_file_cache.c
+++ b/src/core/ngx_open_file_cache.c
@@ -155,6 +155,7 @@ ngx_open_cached_file(ngx_open_file_cache
             of->uniq = ngx_file_uniq(&fi);
             of->mtime = ngx_file_mtime(&fi);
             of->size = ngx_file_size(&fi);
+            of->fs_size = ngx_file_fs_size(&fi);
             of->is_dir = ngx_is_dir(&fi);
             of->is_file = ngx_is_file(&fi);
             of->is_link = ngx_is_link(&fi);
@@ -557,6 +558,7 @@ done:
     of->uniq = ngx_file_uniq(&fi);
     of->mtime = ngx_file_mtime(&fi);
     of->size = ngx_file_size(&fi);
+    of->fs_size = ngx_file_fs_size(&fi);
     of->is_dir = ngx_is_dir(&fi);
     of->is_file = ngx_is_file(&fi);
     of->is_link = ngx_is_link(&fi);
--- a/src/core/ngx_open_file_cache.h
+++ b/src/core/ngx_open_file_cache.h
@@ -20,6 +20,7 @@ typedef struct {
     ngx_file_uniq_t          uniq;
     time_t                   mtime;
     off_t                    size;
+    off_t                    fs_size;
     off_t                    directio;
     size_t                   read_ahead;
 
--- a/src/http/ngx_http_cache.h
+++ b/src/http/ngx_http_cache.h
@@ -50,7 +50,7 @@ typedef struct {
     time_t                           expire;
     time_t                           valid_sec;
     size_t                           body_start;
-    off_t                            length;
+    off_t                            fs_size;
 } ngx_http_file_cache_node_t;
 
 
@@ -68,6 +68,7 @@ struct ngx_http_cache_s {
     size_t                           header_start;
     size_t                           body_start;
     off_t                            length;
+    off_t                            fs_size;
 
     ngx_uint_t                       min_uses;
     ngx_uint_t                       error;
--- a/src/http/ngx_http_file_cache.c
+++ b/src/http/ngx_http_file_cache.c
@@ -349,6 +349,7 @@ ngx_http_file_cache_open(ngx_http_reques
     c->file.log = r->connection->log;
     c->uniq = of.uniq;
     c->length = of.size;
+    c->fs_size = (of.fs_size + cache->bsize - 1) / cache->bsize;
 
     c->buf = ngx_create_temp_buf(r->pool, c->body_start);
     if (c->buf == NULL) {
@@ -411,7 +412,7 @@ ngx_http_file_cache_read(ngx_http_reques
             c->node->exists = 1;
             c->node->uniq = c->uniq;
 
-            cache->sh->size += (c->length + cache->bsize - 1) / cache->bsize;
+            cache->sh->size += c->fs_size;
         }
 
         ngx_shmtx_unlock(&cache->shpool->mutex);
@@ -594,7 +595,7 @@ renew:
     fcn->valid_sec = 0;
     fcn->uniq = 0;
     fcn->body_start = 0;
-    fcn->length = 0;
+    fcn->fs_size = 0;
 
 done:
 
@@ -777,7 +778,7 @@ ngx_http_file_cache_set_header(ngx_http_
 void
 ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf)
 {
-    off_t                   size, length;
+    off_t                   fs_size;
     ngx_int_t               rc;
     ngx_file_uniq_t         uniq;
     ngx_file_info_t         fi;
@@ -800,7 +801,7 @@ ngx_http_file_cache_update(ngx_http_requ
     cache = c->file_cache;
 
     uniq = 0;
-    length = 0;
+    fs_size = 0;
 
     ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                    "http file cache rename: \"%s\" to \"%s\"",
@@ -825,23 +826,18 @@ ngx_http_file_cache_update(ngx_http_requ
 
         } else {
             uniq = ngx_file_uniq(&fi);
-            length = ngx_file_size(&fi);
+            fs_size = (ngx_file_fs_size(&fi) + cache->bsize - 1) / cache->bsize;
         }
     }
 
-    size = (length + cache->bsize - 1) / cache->bsize;
-
     ngx_shmtx_lock(&cache->shpool->mutex);
 
     c->node->count--;
     c->node->uniq = uniq;
     c->node->body_start = c->body_start;
 
-    size = size - (c->node->length + cache->bsize - 1) / cache->bsize;
-
-    c->node->length = length;
-
-    cache->sh->size += size;
+    cache->sh->size += fs_size - c->node->fs_size;
+    c->node->fs_size = fs_size;
 
     if (rc == NGX_OK) {
         c->node->exists = 1;
@@ -1148,7 +1144,7 @@ ngx_http_file_cache_delete(ngx_http_file
     fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);
 
     if (fcn->exists) {
-        cache->sh->size -= (fcn->length + cache->bsize - 1) / cache->bsize;
+        cache->sh->size -= fcn->fs_size;
 
         path = cache->path;
         p = name + path->name.len + 1 + path->len;
@@ -1371,6 +1367,8 @@ ngx_http_file_cache_add_file(ngx_tree_ct
         return NGX_ERROR;
     }
 
+    cache = ctx->data;
+
     if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {
         ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
                       ngx_fd_info_n " \"%s\" failed", name->data);
@@ -1381,6 +1379,7 @@ ngx_http_file_cache_add_file(ngx_tree_ct
         c.valid_msec = h.valid_msec;
         c.body_start = h.body_start;
         c.length = ngx_file_size(&fi);
+        c.fs_size = (ngx_file_fs_size(&fi) + cache->bsize - 1) / cache->bsize;
     }
 
     if (ngx_close_file(fd) == NGX_FILE_ERROR) {
@@ -1406,8 +1405,6 @@ ngx_http_file_cache_add_file(ngx_tree_ct
         c.key[i] = (u_char) n;
     }
 
-    cache = ctx->data;
-
     return ngx_http_file_cache_add(cache, &c);
 }
 
@@ -1447,9 +1444,9 @@ ngx_http_file_cache_add(ngx_http_file_ca
         fcn->uniq = c->uniq;
         fcn->valid_sec = c->valid_sec;
         fcn->body_start = c->body_start;
-        fcn->length = c->length;
+        fcn->fs_size = c->fs_size;
 
-        cache->sh->size += (c->length + cache->bsize - 1) / cache->bsize;
+        cache->sh->size += c->fs_size;
 
     } else {
         ngx_queue_remove(&fcn->queue);
--- a/src/os/unix/ngx_files.h
+++ b/src/os/unix/ngx_files.h
@@ -157,6 +157,7 @@ ngx_int_t ngx_set_file_time(u_char *name
 #define ngx_is_exec(sb)          (((sb)->st_mode & S_IXUSR) == S_IXUSR)
 #define ngx_file_access(sb)      ((sb)->st_mode & 0777)
 #define ngx_file_size(sb)        (sb)->st_size
+#define ngx_file_fs_size(sb)     ((sb)->st_blocks * 512)
 #define ngx_file_mtime(sb)       (sb)->st_mtime
 #define ngx_file_uniq(sb)        (sb)->st_ino
 
--- a/src/os/win32/ngx_files.h
+++ b/src/os/win32/ngx_files.h
@@ -154,6 +154,7 @@ ngx_int_t ngx_file_info(u_char *filename
 
 #define ngx_file_size(fi)                                                    \
     (((off_t) (fi)->nFileSizeHigh << 32) | (fi)->nFileSizeLow)
+#define ngx_file_fs_size(fi)        ngx_file_size(fi)
 
 #define ngx_file_uniq(fi)   (*(ngx_file_uniq_t *) &(fi)->nFileIndexHigh)