Sean Kelly wrote:
dsimcha wrote:
== Quote from Sean Kelly ([email protected])'s article
dsimcha wrote:
Is there an easy way to write a function, or a function already written for me, that will allow for a file shared between processes to be appended to safely? This should be done in a way that will make it impossible for two
processes to write to it at the same time, using locking, and should be
platform-independent.

Performance does not matter because, in the use case I have, we're only
talking about one update every few minutes. Simplicity, however, does matter. All I'm trying to do is run a simulation thousands of times on a bunch of different computers sharing an NFS file system and have all of the results end up in one nice plain text file instead of having each instance write to its own file and having to keep track of them and piece them together by hand.
Use a second file to represent the lock, with the contents as the lock
owner.  While the file exists, poll.  When it's not there, create it and
write the process id into it, then unlink the file when you're done.

Wouldn't you have to somehow atomically poll and create the file? What if some other process created the lock file between your call of exists() and write()?

If you use the "create only" flag when opening the file then it should fail if the file was already created by someone else. Unless NFS doesn't provide a sufficiently reliable synchronization mechanism for this to work, that is (I really don't know).

I've worked a lot with NFS and have the scars and learned the curses to prove it.

NFS is as non-deterministic as it gets when it comes about concurrent writes. There is next to no guarantee. The append problem is an absolute classic on NFS. I tried about five different schemes, all failed under mysterious circumstances. What I do now and suggest you do too is to have each different process create its own file. After all processes have ended, have a master process assemble all small files into one. It's really the only thing I got to work.


Andrei

Reply via email to