Graham Leggett wrote:
> Andreas Steinmetz said:
>
>
>>The problem is that you can't remove directories with htcacheclean
>>without generating race conditions wrt. httpd.
>
>
> In this case the race in httpd should be fixed.
>
> In theory, httpd should attempt to create the directory, then attempt to
> move the file to that directory. If the move fails, attempt to create a
> directory and move the file again, until successful or some sane max
> retries, in which case give up and don't cache the file.
Fix attached and compile tested against 2.1.6 alpha.
--
Andreas Steinmetz SPAMmers use [EMAIL PROTECTED]
--- httpd-2.1.6-alpha/modules/cache/mod_disk_cache.c.orig 2005-08-08
21:52:24.000000000 +0200
+++ httpd-2.1.6-alpha/modules/cache/mod_disk_cache.c 2005-08-08
22:12:14.000000000 +0200
@@ -736,6 +736,7 @@
disk_cache_info_t disk_info;
struct iovec iov[2];
+ int i;
/* This is flaky... we need to manage the cache_info differently */
h->cache_obj->info = *info;
@@ -774,7 +775,14 @@
dobj->tfd = NULL;
- rv = apr_file_rename(dobj->tempfile, dobj->hdrsfile, r->pool);
+ for (i = 0; i < 3; i++) {
+ rv = apr_file_rename(dobj->tempfile, dobj->hdrsfile, r->pool);
+ if (rv == APR_SUCCESS) {
+ break;
+ }
+ apr_sleep(1000);
+ mkdir_structure(conf, 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",
@@ -865,7 +873,14 @@
mkdir_structure(conf, dobj->hdrsfile, r->pool);
}
- rv = apr_file_rename(dobj->tempfile, dobj->hdrsfile, r->pool);
+ for (i = 0; i < 3; i++) {
+ rv = apr_file_rename(dobj->tempfile, dobj->hdrsfile, r->pool);
+ if (rv == APR_SUCCESS) {
+ break;
+ }
+ apr_sleep(1000);
+ mkdir_structure(conf, dobj->hdrsfile, r->pool);
+ }
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,