You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by je...@apache.org on 2005/08/11 01:03:39 UTC

svn commit: r231349 - /httpd/httpd/trunk/modules/cache/mod_disk_cache.c

Author: jerenkrantz
Date: Wed Aug 10 16:03:38 2005
New Revision: 231349

URL: http://svn.apache.org/viewcvs?rev=231349&view=rev
Log:
mod_disk_cache: Retry file rename up to three times to ameliorate race
condition with htcacheclean removing the directories underneath us.

(Includes tweaks by Justin.)

Suggested by: Graham Leggett
Submitted by: Andreas Steinmetz <as...@domdv.de>
Reviewed by: Justin Erenkrantz

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

Modified: httpd/httpd/trunk/modules/cache/mod_disk_cache.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/modules/cache/mod_disk_cache.c?rev=231349&r1=231348&r2=231349&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/mod_disk_cache.c (original)
+++ httpd/httpd/trunk/modules/cache/mod_disk_cache.c Wed Aug 10 16:03:38 2005
@@ -184,6 +184,33 @@
     }
 }
 
+/* htcacheclean may remove directories underneath us.
+ * So, we'll try renaming three times at a cost of 0.002 seconds.
+ */
+static apr_status_t safe_file_rename(disk_cache_conf *conf,
+                                     const char *src, const char *dest,
+                                     apr_pool_t *pool)
+{
+    apr_status_t rv;
+
+    rv = apr_file_rename(src, dest, pool);
+
+    if (rv != APR_SUCCESS) {
+        int i;
+
+        for (i = 0; i < 2 && rv != APR_SUCCESS; i++) {
+            /* 1000 micro-seconds aka 0.001 seconds. */
+            apr_sleep(1000);
+
+            mkdir_structure(conf, dest, pool);
+
+            rv = apr_file_rename(src, dest, pool);
+        }
+    }
+
+    return rv;
+}
+
 static apr_status_t file_cache_el_final(disk_cache_object_t *dobj,
                                         request_rec *r)
 {
@@ -795,7 +822,8 @@
 
             dobj->tfd = NULL;
 
-            rv = apr_file_rename(dobj->tempfile, dobj->hdrsfile, r->pool);
+            rv = safe_file_rename(conf, dobj->tempfile, dobj->hdrsfile,
+                                  r->pool);
             if (rv != APR_SUCCESS) {
                 ap_log_error(APLOG_MARK, APLOG_DEBUG, rv, r->server,
                     "disk_cache: rename tempfile to varyfile failed: %s -> %s",
@@ -886,9 +914,8 @@
     if (rv != APR_SUCCESS) {
         mkdir_structure(conf, dobj->hdrsfile, r->pool);
     }
-    
-    rv = apr_file_rename(dobj->tempfile, dobj->hdrsfile, r->pool);
 
+    rv = safe_file_rename(conf, dobj->tempfile, dobj->hdrsfile, r->pool);
     if (rv != APR_SUCCESS) {
         ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
                      "disk_cache: rename tempfile to hdrsfile failed: %s -> %s",