flock experience
Eric Brunel
eric.brunel at pragmadev.com
Tue Jan 14 09:23:50 EST 2003
Todd Warner wrote:
> File-locking *can* be tricky. Word of caution: if the log-file resides
> on an NFS file-system, things can be... unreliable. We've had issues in
> the past with that. NFS, from what I understand, cannot guarantee when
> something is actually written to disk (note: not an NFS expert).
Did the issues you had involve only "regular" file locking via flock or
fcntl, or file read/writes as well?
I'm quite interested because we had a similar problem, with an added
complexity: the file system we used was exported to Unix workstations via
NFS and to Windows PCs via samba. I tried to use the portalocker module as
found in ActiveState's Python Cookbook (
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65203 ), but it
didn't seem to work as expected: a lock set on Unix worked among Unix
workstations, but not for Windows PCs, and Windows didn't seem to be able
to lock anything on the shared disk.
So we ended up doing our own lock system, based on the (maybe wrong) idea
that a directory creation on any disk, shared or not, is supposed to be
atomic: either the directory doesn't exist, and the creation works, or the
directory already exists, and the creation fails.
So here is a simplified version of the code for our locking system:
-------------------------------
import os
class AlreadyLocked(Exception):
pass
class FileLock:
def __init__(self, fileName):
self.__lockName = os.path.join(os.path.dirname(fileName),
".%s.lck" % os.path.dirname(fileName))
try:
os.mkdir(self.__lockName)
except OsError:
self.__lockName = None
raise AlreadyLocked()
def release(self):
if self.__lockName is None: return
os.rmdir(self.__lockName)
------------------------------
Until now, this method has been quite successful. But is it really secure,
or may we get problems someday?
--
- Eric Brunel <eric.brunel at pragmadev.com> -
PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com
More information about the Python-list
mailing list