write()s and pwrite()s from multiple threads in OSX

Jorge Chamorro jorge at jorgechamorro.com
Tue Nov 23 11:55:58 CET 2010


We've found, in nodejs, that on Mac OSX, when write()ing to a disk file in a tight loop from >= 2 threads, sometimes some write()s seem to fail to write the data but update the fd's file pointer properly, resulting in strings of zeroes ('holes') of data.length length in the file.

Here's a test case demonstrating the problem: https://gist.github.com/703744

$ curl 'https://gist.github.com/raw/703744/1bfa3c7022995e2f6cf2452a892e1c3b0e245cb7/AppleWiteBug.c' > bug.c
$ gcc -pthread bug.c
$ ./a.out
^@^@^@^@^@^@^@^@^@^@^@^@a lo bestia
^@^@^@^@^@^@^@^@^@^@^@^@a lo bestia
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@a lo bestia
^@^@^@^@^@^@^@^@^@^@^@^@a lo bestia
^@^@^@^@^@^@^@^@^@^@^@^@a lo bestia
^@^@^@^@^@^@^@^@^@^@^@^@a lo bestia

So Ryan has accepted a patch of mine to libeio so as to avoid any write()s to happen concurrently on OSX only, with a lock/mutex. Here's what we're doing now : https://github.com/ry/node/commit/6aa92d5289996780834ebd5e9317718b3e55408c

The thing is, Marc, can you look into this, and tell me what you think about it ?


More information about the libev mailing list