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

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

    /* ... do lots of writing ... */

    apr_file_flush(fp);
    apr_file_close(fp);

status = apr_file_rename(tempname, filename, pool); /* filename is in the same directory as tempname */
    BOOM! strerror() says "no such file or directory"

Then if I go and look, what do you know, the tempfile actually is there. If I process 500 requests in a big hurry, 100 each from 5 concurrent clients, this will happen maybe half a dozen times, in an unpredictable order. There are ways to work around this, but still, it's kinda disturbing. It's either, in decreasing order of probability (a) me doing something stupid, (b) OS X filesystem weirdness, (c) an APR bug. apr_file_write_full() doesn't seem to make a difference.

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).

 -T

Reply via email to