write()s and pwrite()s from multiple threads in OSX
Jorge Chamorro
jorge at jorgechamorro.com
Tue Nov 23 11:55:58 CET 2010
Hi,
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 ?
Thanks,
--
Jorge.
More information about the libev
mailing list