diff --git a/mayan/apps/lock_manager/backends/base.py b/mayan/apps/lock_manager/backends/base.py index 941e0d9ccf..4b05642005 100644 --- a/mayan/apps/lock_manager/backends/base.py +++ b/mayan/apps/lock_manager/backends/base.py @@ -1,5 +1,9 @@ from __future__ import unicode_literals +import logging + +logger = logging.getLogger(__name__) + class LockingBackend(object): """ @@ -8,8 +12,11 @@ class LockingBackend(object): """ @classmethod def acquire_lock(cls, name, timeout=None): - raise NotImplementedError + logger.debug('acquiring lock: %s, timeout: %s', name, timeout) @classmethod def purge_locks(cls): - raise NotImplementedError + logger.debug('purging locks') + + def release(self): + logger.debug('releasing lock: %s', self.name) diff --git a/mayan/apps/lock_manager/backends/file_lock.py b/mayan/apps/lock_manager/backends/file_lock.py index 99f286d9b9..d9e6ad2695 100644 --- a/mayan/apps/lock_manager/backends/file_lock.py +++ b/mayan/apps/lock_manager/backends/file_lock.py @@ -31,6 +31,7 @@ class FileLock(LockingBackend): @classmethod def acquire_lock(cls, name, timeout=None): + super(FileLock, cls).acquire_lock(name=name, timeout=timeout) instance = FileLock( name=name, timeout=timeout or setting_default_lock_timeout.value ) @@ -38,6 +39,7 @@ class FileLock(LockingBackend): @classmethod def purge_locks(cls): + super(FileLock, cls).purge_locks() lock.acquire() with open(cls.lock_file, 'r+') as file_object: locks.lock(f=file_object, flags=locks.LOCK_EX) @@ -92,6 +94,8 @@ class FileLock(LockingBackend): lock.release() def release(self): + super(FileLock, self).release() + lock.acquire() with open(self.__class__.lock_file, 'r+') as file_object: locks.lock(f=file_object, flags=locks.LOCK_EX) diff --git a/mayan/apps/lock_manager/backends/model_lock.py b/mayan/apps/lock_manager/backends/model_lock.py index 59b9415f8a..091db64b0c 100644 --- a/mayan/apps/lock_manager/backends/model_lock.py +++ b/mayan/apps/lock_manager/backends/model_lock.py @@ -8,10 +8,23 @@ from .base import LockingBackend class ModelLock(LockingBackend): @classmethod def acquire_lock(cls, name, timeout=None): + super(ModelLock, cls).acquire_lock(name=name, timeout=timeout) Lock = apps.get_model(app_label='lock_manager', model_name='Lock') - return Lock.objects.acquire_lock(name=name, timeout=timeout) + return ModelLock( + model_instance = Lock.objects.acquire_lock( + name=name, timeout=timeout + ) + ) @classmethod def purge_locks(cls): + super(ModelLock, cls).purge_locks() Lock = apps.get_model(app_label='lock_manager', model_name='Lock') Lock.objects.select_for_update().delete() + + def __init__(self, model_instance): + self.model_instance = model_instance + + def release(self): + super(ModelLock, self).release() + self.model_instance.release()