On 2008-10-03, at 02:40, Tim Bray wrote:

I'm developing a module which accepts a large number of POST requests, receives the request bodies, and persists them into ordinary files in the filesystem. On OS X, there are occasions where the file is (rarely) transiently not there. The idiom looks like this

Same code running in -X single-threaded mode, no problem. Same code on Solaris, no problem. (Well, yes, there are other weird Solaris problems with mutexes, but we'll get to those).


Sounds like a race. I'd suggest you replace this:

status = apr_file_open(&fp, tempname, APR_FOPEN_WRITE | APR_FOPEN_CREATE,
                          PERMS, pool);

with

apr_status_t status;
do {
  ... generate random filename ...
status = apr_file_open(..., APR_FOPEN_WRITE|APR_FOPEN_CREATE| APR_FOPEN_EXCL, ...);
} while (APR_IS_EEXIST(status));

in order to hedge against another thread operating on the same filename concurrently. apr_file_mktemp will handle this detail transparently for you.

— Gordon

Reply via email to