Imagine two processes, a reader and a writer, communicating via a regular file on an ext3 fs. Reader has an inotify
IN_MODIFY watch on the file. Writer writes 1000 bytes to the file, in a single
write() call. Reader gets the inotify event, and calls
fstat on the file. What does Reader see?
Is there any guarantee that Reader will get back at least 1000 for
st_sizeon the file? From my experiments, it seems not.
Is there any guarantee that Reader can actually
This is happening on a seriously I/O bound box. For example,
sar shows an await times of about 1 second. In my case the Reader is actually waiting 10 seconds AFTER getting the inotify event before calling
stat, and getting too-small results.
What I had hoped was that the inotify event would not be delivered until the file was ready. What I suspect is actually happening is that the inotify event fires DURING the
write() call in the Writer, and the data is actually available to other processes on the system whenever it happens to be ready. In this case, 10s is not enough time.
I guess I am just looking for confirmation that the kernel actually implements inotify the way I am guessing. Also, if there are any options, possibly, to alter this behavior?
Finally- what is the point of inotify, given this behavior? You're reduced to polling the file/directory anyway, after you get the event, until the data is actually available. Might as well be doing that all along, and forget about inotify.
*** EDIT **** Okay, as often happens, the behavior I am seeing actually makes sense, now that I understand what I am really doing. ^_^
I am actually responding to an IN_CREATE event on the directory the file lives in. So I am actually stat()'ing the file in response to the creation of the file, not necessarily the IN_MODIFY event, which may be arriving later.
I am going to change my code so that, once I get the IN_CREATE event, I will subscribe to IN_MODIFY on the file itself, and I won't actually attempt to read the file until I get the IN_MODIFY event. I realize that there is a small window there in which I may miss a write to the file, but this is acceptable for my application, because in the worst case, the file will be closed after a maximum number of seconds.