Files
mayan-edms/mayan/apps/lock_manager/backends/redis_lock.py
Roberto Rosario 778c48d11d Update Redis lock to support Redis version < 5.0
Update the Redis lock connection intialization so that is works with
Redis versions < 5.0.

GitLab issue #709. Rob de Canha-Knight (@rssfed23) for the report
and debug information.

Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
2019-12-16 04:20:17 -04:00

45 lines
1.3 KiB
Python

from __future__ import unicode_literals
import redis
from ..exceptions import LockError
from ..settings import setting_backend_arguments
from .base import LockingBackend
class RedisLock(LockingBackend):
@classmethod
def acquire_lock(cls, name, timeout=None):
super(RedisLock, cls).acquire_lock(name=name, timeout=timeout)
return RedisLock(name=name, timeout=timeout)
@classmethod
def get_redis_connection(cls):
redis_url = setting_backend_arguments.value.get('redis_url', None)
server = redis.from_url(url=redis_url)
# Force to initialize the connection
server.client()
return server
@classmethod
def purge_locks(cls):
super(RedisLock, cls).purge_locks()
def __init__(self, name, timeout):
self.name = name
redis_lock_instance = self.get_redis_connection().lock(
name=name, timeout=timeout, sleep=0.1, blocking_timeout=0.1
)
if redis_lock_instance.acquire():
self.redis_lock_instance = redis_lock_instance
else:
raise LockError
def release(self):
super(RedisLock, self).release()
try:
self.redis_lock_instance.release()
except redis.exceptions.LockNotOwnedError:
return