Re: apreqXXXXXX temp files remain after processing uploads greater than 256kb. Further large upload fails

Randy Kobes <[email protected]>
Newsgroups gmane.comp.apache.apreq
Message-ID <[email protected]>
On Fri, 9 Mar 2007, Joe Schaefer wrote:

> Randy, do you know why we use the APR_FILE_NOCLEANUP flag?  Maybe
> we should just remove that and see if it fixes the problem Vinay
> is seeing.

Hi Steve, and all,
  If you remember from
    http://marc.theaimsgroup.com/?t=115337629400001&r=1&w=2
there was a problem with stray temp files in apreq
remaining after uploads; we came up with a fix that
worked most of the time, but Vinay has come up with
something that appears better, and more understandable.
The attached diff against library/util.c (in the svn
sources) works for me in getting multiple invocations
of the glue/perl/t/apreq/upload.t to pass; if you have
time, could you try it out to see how it fares on
your system? Thanks.

-- 
best regards,
Randy
util.diff (text/plain, 1.2 KB)
Index: util.c
===================================================================
--- util.c	(revision 516656)
+++ util.c	(working copy)
@@ -775,12 +775,14 @@
 
 struct cleanup_data {
     const char *fname;
+    apr_file_t *f;
     apr_pool_t *pool;
 };
 
 static apr_status_t apreq_file_cleanup(void *d)
 {
     struct cleanup_data *data = d;
+    apr_file_close(data->f);
     return apr_file_remove(data->fname, data->pool);
 }
 
@@ -823,19 +825,12 @@
 
     /* NO APR_DELONCLOSE! see comment above */
     flag = APR_CREATE | APR_READ | APR_WRITE | APR_EXCL | APR_BINARY;
-    /* Win32 needs the following to remove temp files.
-     * XXX: figure out why the APR_SHARELOCK flag works;
-     * a grep through the httpd sources seems to indicate
-     * it's only used in sdbm files??
-    */
-#ifdef WIN32
-    flag |= APR_FILE_NOCLEANUP | APR_SHARELOCK;
-#endif
-    rc = apr_file_mktemp(fp, tmpl, flag, pool);
 
+    rc = apr_file_mktemp(fp, tmpl, flag, pool);
     if (rc == APR_SUCCESS) {
         apr_file_name_get(&data->fname, *fp);
         data->pool = pool;
+        data->f = *fp;
     }
     else {
         apr_pool_cleanup_kill(pool, data, apreq_file_cleanup);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.