[utils] locked_file: Do not truncate files before locking (#2994)
Authored by: jakeogh, pukkandan
This commit is contained in:
parent
06b1628d3e
commit
fcfa8853e4
1 changed files with 19 additions and 4 deletions
|
@ -2222,10 +2222,23 @@ class locked_file(object):
|
||||||
locked = False
|
locked = False
|
||||||
|
|
||||||
def __init__(self, filename, mode, block=True, encoding=None):
|
def __init__(self, filename, mode, block=True, encoding=None):
|
||||||
assert mode in {'r', 'rb', 'a', 'ab', 'w', 'wb'}
|
if mode not in {'r', 'rb', 'a', 'ab', 'w', 'wb'}:
|
||||||
self.f = open(filename, mode, encoding=encoding)
|
raise NotImplementedError(mode)
|
||||||
self.mode = mode
|
self.mode, self.block = mode, block
|
||||||
self.block = block
|
|
||||||
|
writable = any(f in mode for f in 'wax+')
|
||||||
|
readable = any(f in mode for f in 'r+')
|
||||||
|
flags = functools.reduce(operator.ior, (
|
||||||
|
getattr(os, 'O_CLOEXEC', 0), # UNIX only
|
||||||
|
getattr(os, 'O_BINARY', 0), # Windows only
|
||||||
|
getattr(os, 'O_NOINHERIT', 0), # Windows only
|
||||||
|
os.O_CREAT if writable else 0, # O_TRUNC only after locking
|
||||||
|
os.O_APPEND if 'a' in mode else 0,
|
||||||
|
os.O_EXCL if 'x' in mode else 0,
|
||||||
|
os.O_RDONLY if not writable else os.O_RDWR if readable else os.O_WRONLY,
|
||||||
|
))
|
||||||
|
|
||||||
|
self.f = os.fdopen(os.open(filename, flags), mode, encoding=encoding)
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
exclusive = 'r' not in self.mode
|
exclusive = 'r' not in self.mode
|
||||||
|
@ -2235,6 +2248,8 @@ class locked_file(object):
|
||||||
except IOError:
|
except IOError:
|
||||||
self.f.close()
|
self.f.close()
|
||||||
raise
|
raise
|
||||||
|
if 'w' in self.mode:
|
||||||
|
self.f.truncate()
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def unlock(self):
|
def unlock(self):
|
||||||
|
|
Loading…
Reference in a new issue