in reply to File locking on NFS

File locking in NFS is broken (with respect to how you'd expect it to work on a local filesystem). You'll either have to do some sort of lock-file hack (like you propose) or use a different networking filesystem (I thin that DFS and AFS handle this well, but that may not be an option for you). Instead of writing something yourself I recomend you use a module like LockFile::Simple, DotLock or IPC::Locker, which is designed to manage lockfiles, these modules can still have problems w/ NFS due to possible race conditions (see the individual module's docs for details). Writing locking code yourself is tricky and subject to problems unless you're really careful.

Replies are listed 'Best First'.
(tye)Re: File locking on NFS
by tye (Sage) on Apr 04, 2001 at 21:18 UTC

    File locking in NFS is broken

    I recall that being true a long time ago and then I recall it working quite well after that. Has perhaps Linux brought back the badly broken NFS lock?

    You'll either have to do some sort of lock-file hack

    Last I checked, NFS didn't support atomicity of file creation, deletion, nor rename, which would make a lock-file hack not work well under NFS.

    So am I just really out of date?

            - tye (but my friends call me "Tye")
      I am not positive on rename, but I believe that it will actually be atomic on NFS partitions as long as the data does not cross file-system boundaries. If you know of solid documentation on this one way or another, that would be good.

      As for locking, Linux dropped the use of fcntl/lockf for flock a while ago due to some nasty recurring bugs. So flock does not work over NFS for Linux any more. Also fcntl did not when I tried it work totally smoothly. But I did not tinker much, that was a while ago, and I know that in the last few 2.2 releases (and of course in the new 2.4 series) NFS was improved greatly.

        google turned up this which says:

        Using a mail spool on a NFS mounted partition is not really safe, because locking (fcntl() and flock()) don't work over NFS without a lockd. That's why most systems also use dotlocking (mailbock.lock files). This works if the MTA and MUA use link() to lock the mailbox, since link() is guaranteed to be atomic, also over NFS.

        However most systems use open(file, O_CREAT|O_WRONLY|O_EXCL, mode) to creat a lockfile. And NFS doesn't know about O_EXCL, so this still doesn't work.

        I'm used to NFS with lockd (which was always broken when I started using NFS but was working great when I stopped using NFS several years ago).

        I distinctly recall reading about how unlink() isn't atomic over NFS so I'm still surprised that link() is guaranteed to be atomic over NFS, but I guess I'll get over that eventually. (:

        But our original querist should note that bit about NFS not knowing about O_EXCL!

                - tye (but my friends call me "Tye")