aboutsummaryrefslogtreecommitdiffstats
path: root/library/python/filelock
diff options
context:
space:
mode:
authorDmitry Kopylov <kopylovd@gmail.com>2022-02-10 16:48:18 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:48:18 +0300
commitb2f5101486cc0de2e979c8ba9ada2109785bf5fd (patch)
treeaffe28b840816b505db0467f2285b01c89c04247 /library/python/filelock
parente9b28b5aad71453a4637b70dde02e801e4147a2a (diff)
downloadydb-b2f5101486cc0de2e979c8ba9ada2109785bf5fd.tar.gz
Restoring authorship annotation for Dmitry Kopylov <kopylovd@gmail.com>. Commit 1 of 2.
Diffstat (limited to 'library/python/filelock')
-rw-r--r--library/python/filelock/__init__.py102
-rw-r--r--library/python/filelock/ut/lib/test_filelock.py24
2 files changed, 63 insertions, 63 deletions
diff --git a/library/python/filelock/__init__.py b/library/python/filelock/__init__.py
index f81ff67f37..aea171410d 100644
--- a/library/python/filelock/__init__.py
+++ b/library/python/filelock/__init__.py
@@ -5,9 +5,9 @@ import sys
import library.python.windows
-logger = logging.getLogger(__name__)
-
+logger = logging.getLogger(__name__)
+
def set_close_on_exec(stream):
if library.python.windows.on_win():
library.python.windows.set_handle_information(stream, inherit=False)
@@ -16,16 +16,16 @@ def set_close_on_exec(stream):
fcntl.fcntl(stream, fcntl.F_SETFD, fcntl.FD_CLOEXEC)
-class AbstractFileLock(object):
-
+class AbstractFileLock(object):
+
def __init__(self, path):
self.path = path
def acquire(self, blocking=True):
- raise NotImplementedError
+ raise NotImplementedError
def release(self):
- raise NotImplementedError
+ raise NotImplementedError
def __enter__(self):
self.acquire()
@@ -34,17 +34,17 @@ class AbstractFileLock(object):
def __exit__(self, type, value, traceback):
self.release()
-
-class _NixFileLock(AbstractFileLock):
-
- def __init__(self, path):
- super(_NixFileLock, self).__init__(path)
+
+class _NixFileLock(AbstractFileLock):
+
+ def __init__(self, path):
+ super(_NixFileLock, self).__init__(path)
from fcntl import flock, LOCK_EX, LOCK_UN, LOCK_NB
self._locker = lambda lock, blocking: flock(lock, LOCK_EX if blocking else LOCK_EX | LOCK_NB)
self._unlocker = lambda lock: flock(lock, LOCK_UN)
self._lock = open(self.path, 'a')
set_close_on_exec(self._lock)
-
+
def acquire(self, blocking=True):
import errno
try:
@@ -54,69 +54,69 @@ class _NixFileLock(AbstractFileLock):
return False
raise
return True
-
- def release(self):
+
+ def release(self):
self._unlocker(self._lock)
-
+
def __del__(self):
if hasattr(self, "_lock"):
self._lock.close()
-
-
-class _WinFileLock(AbstractFileLock):
- """
- Based on LockFile / UnlockFile from win32 API
- https://msdn.microsoft.com/en-us/library/windows/desktop/aa365202(v=vs.85).aspx
- """
-
- _LOCKED_BYTES_NUM = 1
-
- def __init__(self, path):
- super(_WinFileLock, self).__init__(path)
- self._lock = None
+
+
+class _WinFileLock(AbstractFileLock):
+ """
+ Based on LockFile / UnlockFile from win32 API
+ https://msdn.microsoft.com/en-us/library/windows/desktop/aa365202(v=vs.85).aspx
+ """
+
+ _LOCKED_BYTES_NUM = 1
+
+ def __init__(self, path):
+ super(_WinFileLock, self).__init__(path)
+ self._lock = None
try:
with file(path, 'w') as lock_file:
lock_file.write(" " * self._LOCKED_BYTES_NUM)
except IOError as e:
if e.errno != errno.EACCES or not os.path.isfile(path):
raise
-
+
def acquire(self, blocking=True):
- self._lock = open(self.path)
+ self._lock = open(self.path)
set_close_on_exec(self._lock)
- import time
+ import time
locked = False
- while not locked:
+ while not locked:
locked = library.python.windows.lock_file(self._lock, 0, self._LOCKED_BYTES_NUM, raises=False)
if locked:
return True
if blocking:
- time.sleep(.5)
+ time.sleep(.5)
else:
return False
-
- def release(self):
+
+ def release(self):
if self._lock:
library.python.windows.unlock_file(self._lock, 0, self._LOCKED_BYTES_NUM, raises=False)
self._lock.close()
self._lock = None
-
-
-class FileLock(AbstractFileLock):
-
- def __init__(self, path):
- super(FileLock, self).__init__(path)
-
- if sys.platform.startswith('win'):
- self._lock = _WinFileLock(path)
- else:
- self._lock = _NixFileLock(path)
-
+
+
+class FileLock(AbstractFileLock):
+
+ def __init__(self, path):
+ super(FileLock, self).__init__(path)
+
+ if sys.platform.startswith('win'):
+ self._lock = _WinFileLock(path)
+ else:
+ self._lock = _NixFileLock(path)
+
def acquire(self, blocking=True):
logger.debug('Acquiring filelock (blocking=%s): %s', blocking, self.path)
return self._lock.acquire(blocking)
-
- def release(self):
- logger.debug('Ensuring filelock released: %s', self.path)
- return self._lock.release()
+
+ def release(self):
+ logger.debug('Ensuring filelock released: %s', self.path)
+ return self._lock.release()
diff --git a/library/python/filelock/ut/lib/test_filelock.py b/library/python/filelock/ut/lib/test_filelock.py
index 1b11d89123..4c985022d4 100644
--- a/library/python/filelock/ut/lib/test_filelock.py
+++ b/library/python/filelock/ut/lib/test_filelock.py
@@ -1,13 +1,13 @@
-import os
-import time
-import logging
-import multiprocessing
+import os
+import time
+import logging
+import multiprocessing
import tempfile
import threading
-
+
import library.python.filelock
-
-
+
+
def _acquire_lock(lock_path, out_file_path):
with library.python.filelock.FileLock(lock_path):
with open(out_file_path, "a") as out:
@@ -15,21 +15,21 @@ def _acquire_lock(lock_path, out_file_path):
time.sleep(2)
-def test_filelock():
+def test_filelock():
temp_dir = tempfile.mkdtemp()
lock_path = os.path.join(temp_dir, "file.lock")
out_file_path = os.path.join(temp_dir, "out.txt")
-
+
process_count = 5
processes = []
for i in range(process_count):
process = multiprocessing.Process(target=_acquire_lock, args=(lock_path, out_file_path))
process.start()
processes.append(process)
-
+
for process in processes:
process.join()
-
+
pids = []
times = []
with open(out_file_path) as out:
@@ -39,7 +39,7 @@ def test_filelock():
pid, time_val = line.split(":")
pids.append(pid)
times.append(float(time_val))
-
+
assert len(set(pids)) == process_count
time1 = times.pop()
while times: