You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by mi...@apache.org on 2010/09/29 22:00:12 UTC

svn commit: r1002832 - in /httpd/httpd/trunk: modules/cache/mod_disk_cache.c support/htcacheclean.c

Author: minfrin
Date: Wed Sep 29 20:00:11 2010
New Revision: 1002832

URL: http://svn.apache.org/viewvc?rev=1002832&view=rev
Log:
mod_disk_cache: Instead of creating an empty data file when the body is
empty, don't create a file at all, saving inodes.

Modified:
    httpd/httpd/trunk/modules/cache/mod_disk_cache.c
    httpd/httpd/trunk/support/htcacheclean.c

Modified: httpd/httpd/trunk/modules/cache/mod_disk_cache.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/mod_disk_cache.c?rev=1002832&r1=1002831&r2=1002832&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/mod_disk_cache.c (original)
+++ httpd/httpd/trunk/modules/cache/mod_disk_cache.c Wed Sep 29 20:00:11 2010
@@ -514,29 +514,6 @@ static int open_entity(cache_handle_t *h
 
     dobj->data.file = data_file(r->pool, conf, dobj, nkey);
 
-    /* Open the data file */
-    flags = APR_READ|APR_BINARY;
-#ifdef APR_SENDFILE_ENABLED
-    /* When we are in the quick handler we don't have the per-directory
-     * configuration, so this check only takes the global setting of
-     * the EnableSendFile directive into account.
-     */
-    flags |= AP_SENDFILE_ENABLED(coreconf->enable_sendfile);
-#endif
-    rc = apr_file_open(&dobj->data.fd, dobj->data.file, flags, 0, r->pool);
-    if (rc != APR_SUCCESS) {
-        ap_log_error(APLOG_MARK, APLOG_ERR, rc, r->server,
-                 "disk_cache: Cannot open data file %s",  dobj->data.file);
-        apr_file_close(dobj->hdrs.fd);
-        return DECLINED;
-    }
-
-    rc = apr_file_info_get(&finfo, APR_FINFO_SIZE | APR_FINFO_IDENT,
-            dobj->data.fd);
-    if (rc == APR_SUCCESS) {
-        dobj->file_size = finfo.size;
-    }
-
     /* Read the bytes to setup the cache_info fields */
     rc = file_cache_recall_mydata(dobj->hdrs.fd, info, dobj, r);
     if (rc != APR_SUCCESS) {
@@ -548,13 +525,43 @@ static int open_entity(cache_handle_t *h
 
     apr_file_close(dobj->hdrs.fd);
 
-    /* Atomic check - does the body file belong to the header file? */
-    if (dobj->disk_info.inode == finfo.inode && dobj->disk_info.device == finfo.device) {
+    /* Open the data file */
+    if (dobj->disk_info.has_body) {
+        flags = APR_READ | APR_BINARY;
+#ifdef APR_SENDFILE_ENABLED
+        /* When we are in the quick handler we don't have the per-directory
+         * configuration, so this check only takes the global setting of
+         * the EnableSendFile directive into account.
+         */
+        flags |= AP_SENDFILE_ENABLED(coreconf->enable_sendfile);
+#endif
+        rc = apr_file_open(&dobj->data.fd, dobj->data.file, flags, 0, r->pool);
+        if (rc != APR_SUCCESS) {
+            ap_log_error(APLOG_MARK, APLOG_ERR, rc, r->server,
+                    "disk_cache: Cannot open data file %s", dobj->data.file);
+            apr_file_close(dobj->hdrs.fd);
+            return DECLINED;
+        }
 
-        /* Initialize the cache_handle callback functions */
-        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
-                     "disk_cache: Recalled cached URL info header %s",  dobj->name);
+        rc = apr_file_info_get(&finfo, APR_FINFO_SIZE | APR_FINFO_IDENT,
+                dobj->data.fd);
+        if (rc == APR_SUCCESS) {
+            dobj->file_size = finfo.size;
+        }
+
+        /* Atomic check - does the body file belong to the header file? */
+        if (dobj->disk_info.inode == finfo.inode &&
+                dobj->disk_info.device == finfo.device) {
+
+            /* Initialize the cache_handle callback functions */
+            ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
+                         "disk_cache: Recalled cached URL info header %s",  dobj->name);
+
+            return OK;
+        }
 
+    }
+    else {
         return OK;
     }
 
@@ -845,7 +852,9 @@ static apr_status_t recall_body(cache_ha
     apr_bucket *e;
     disk_cache_object_t *dobj = (disk_cache_object_t*) h->cache_obj->vobj;
 
-    apr_brigade_insert_file(bb, dobj->data.fd, 0, dobj->file_size, p);
+    if (dobj->data.fd) {
+        apr_brigade_insert_file(bb, dobj->data.fd, 0, dobj->file_size, p);
+    }
 
     e = apr_bucket_eos_create(bb->bucket_alloc);
     APR_BRIGADE_INSERT_TAIL(bb, e);
@@ -915,6 +924,8 @@ static apr_status_t write_headers(cache_
     disk_cache_info_t disk_info;
     struct iovec iov[2];
 
+    bzero(&disk_info, sizeof(disk_cache_info_t));
+
     if (dobj->headers_out) {
         const char *tmp;
 
@@ -1045,26 +1056,6 @@ static apr_status_t store_body(cache_han
     disk_cache_dir_conf *dconf = ap_get_module_config(r->per_dir_config, &disk_cache_module);
     int seen_eos = 0;
 
-    /* We write to a temp file and then atomically rename the file over
-     * in file_cache_el_final().
-     */
-    if (!dobj->data.tempfd) {
-        apr_finfo_t finfo;
-        rv = apr_file_mktemp(&dobj->data.tempfd, dobj->data.tempfile,
-                             APR_CREATE | APR_WRITE | APR_BINARY |
-                             APR_BUFFERED | APR_EXCL, dobj->data.pool);
-        if (rv != APR_SUCCESS) {
-            return rv;
-        }
-        dobj->file_size = 0;
-        rv = apr_file_info_get(&finfo, APR_FINFO_IDENT,
-                dobj->data.tempfd);
-        if (rv != APR_SUCCESS) {
-            return rv;
-        }
-        dobj->disk_info.device = finfo.device;
-        dobj->disk_info.inode = finfo.inode;
-    }
     if (!dobj->bb) {
         dobj->bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
     }
@@ -1131,6 +1122,33 @@ static apr_status_t store_body(cache_han
             return rv;
         }
 
+        /* don't write empty buckets to the cache */
+        if (!length) {
+            continue;
+        }
+
+        /* Attempt to create the data file at the last possible moment, if
+         * the body is empty, we don't write a file at all, and save an inode.
+         */
+        if (!dobj->data.tempfd) {
+            apr_finfo_t finfo;
+            rv = apr_file_mktemp(&dobj->data.tempfd, dobj->data.tempfile,
+                                 APR_CREATE | APR_WRITE | APR_BINARY |
+                                 APR_BUFFERED | APR_EXCL, dobj->data.pool);
+            if (rv != APR_SUCCESS) {
+                return rv;
+            }
+            dobj->file_size = 0;
+            rv = apr_file_info_get(&finfo, APR_FINFO_IDENT,
+                    dobj->data.tempfd);
+            if (rv != APR_SUCCESS) {
+                return rv;
+            }
+            dobj->disk_info.device = finfo.device;
+            dobj->disk_info.inode = finfo.inode;
+            dobj->disk_info.has_body = 1;
+        }
+
         /* write to the cache, leave if we fail */
         rv = apr_file_write_full(dobj->data.tempfd, str, length, &written);
         if (rv != APR_SUCCESS) {
@@ -1179,7 +1197,9 @@ static apr_status_t store_body(cache_han
     if (seen_eos) {
         const char *cl_header = apr_table_get(r->headers_out, "Content-Length");
 
-        apr_file_close(dobj->data.tempfd);
+        if (dobj->data.tempfd) {
+            apr_file_close(dobj->data.tempfd);
+        }
 
         if (r->connection->aborted || r->no_cache) {
             ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,

Modified: httpd/httpd/trunk/support/htcacheclean.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/support/htcacheclean.c?rev=1002832&r1=1002831&r2=1002832&view=diff
==============================================================================
--- httpd/httpd/trunk/support/htcacheclean.c (original)
+++ httpd/httpd/trunk/support/htcacheclean.c Wed Sep 29 20:00:11 2010
@@ -493,6 +493,11 @@ static int process_dir(char *path, apr_p
                             e->hsize = d->hsize;
                             e->dsize = d->dsize;
                             e->basename = apr_pstrdup(pool, d->basename);
+                            if (!disk_info.has_body) {
+                                apr_file_remove(apr_pstrcat(p, path, "/", d->basename,
+                                                            CACHE_DATA_SUFFIX, NULL),
+                                                p);
+                            }
                             break;
                         }
                         else {
@@ -568,8 +573,40 @@ static int process_dir(char *path, apr_p
                             break;
                         }
                     }
+                    else if (format == DISK_FORMAT_VERSION) {
+                        apr_off_t offset = 0;
+
+                        apr_file_seek(fd, APR_SET, &offset);
+
+                        len = sizeof(disk_cache_info_t);
+
+                        if (apr_file_read_full(fd, &disk_info, len,
+                                               &len) == APR_SUCCESS) {
+                            apr_file_close(fd);
+                            e = apr_palloc(pool, sizeof(ENTRY));
+                            APR_RING_INSERT_TAIL(&root, e, _entry, link);
+                            e->expire = disk_info.expire;
+                            e->response_time = disk_info.response_time;
+                            e->htime = d->htime;
+                            e->dtime = d->dtime;
+                            e->hsize = d->hsize;
+                            e->dsize = d->dsize;
+                            e->basename = apr_pstrdup(pool, d->basename);
+                            break;
+                        }
+                        else {
+                            apr_file_close(fd);
+                        }
+                    }
+                    else {
+                        apr_file_close(fd);
+                        delete_entry(path, d->basename, p);
+                        break;
+                    }
+                }
+                else {
+                    apr_file_close(fd);
                 }
-                apr_file_close(fd);
             }
 
             if (realclean || d->htime < current - deviation