On Jul 2, 2008, at 19:01, Damien Katz wrote:

So erlang still has some file driver troubles. The old issue of a 2gig limit is long gone, however two other issues remain:

Erlangs built-in file api for disk sync/flush doesn't work on all platforms. The main two that I know where it doesn't work are windows (at least it didn't when a looked over a year ago) and OS X (perhaps other BSDs?). On OS X, the fix seems to be as simple as passing the F_FULLFSYNC flag to fcntl. Without this disk sync, there is no way CouchDB can safely store data. This means we either need the Erlang folks to fix their drivers, or create our own file driver for the problem platforms. Blech.

I'm not a C hacker and all but would this patch solve the issue on Darwin / Mac OS X?

I worked solely off documentation:
http://developer.apple.com/documentation/Darwin/Reference/ManPages/man2/fsync.2.html#/ /apple_ref/doc/man/2/fsync
http://developer.apple.com/documentation/Darwin/Reference/ManPages/man2/fcntl.2.html

The diff is against OTP R12B-3:

--- erts/emulator/drivers/unix/unix_efile.c 2008-07-17 03:06:13.000000000 +0200 +++ erts/emulator/drivers/unix/unix_efile_new.c 2008-07-17 03:06:57.000000000 +0200
@@ -44,11 +44,20 @@
 #endif
 #endif /* _OSE_ */

+#if defined(__APPLE__) && defined(__MACH__) && !defined(__DARWIN__)
+#define DARWIN 1
+#endif
+
+#ifdef DARWIN
+#include <fcntl.h>
+#endif /* DARWIN */
+
 #ifdef VXWORKS
 #include <ioLib.h>
 #include <dosFsLib.h>
 #include <nfsLib.h>
 #include <sys/stat.h>
+
 /*
** Not nice to include usrLib.h as MANY normal variable names get reported
 ** as shadowing globals, like 'i' for example.
@@ -818,7 +827,11 @@
   undefined fsync
 #endif /* VXWORKS */
 #else
+#ifdef DARWIN
+    return check_error(fcntl(fd, F_FULLFSYNC), errInfo);
+#else /* all other unix systems */
     return check_error(fsync(fd), errInfo);
+#endif /* DARWIN */
 #endif /* NO_FSYNC */
 }

If that looks okay, I'll forward it to the erlang-patches mailing list for inclusion.

Cheers
Jan
--

Reply via email to