From ffe76ebd8080a699dd1e2bbaa40f7acc158c6f08 Mon Sep 17 00:00:00 2001 From: pyMan Date: Tue, 18 Aug 2015 10:31:02 +0200 Subject: [PATCH 1/2] Two fixes with DBMutexTimeoutError Fix: DBMutexTimeoutError not raised if dbmutex record still existing but expired Fix/Improvment: any exception has precedence over DBMutexTimeoutError --- db_mutex/db_mutex.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/db_mutex/db_mutex.py b/db_mutex/db_mutex.py index c6e0b9a..aa1c1d3 100644 --- a/db_mutex/db_mutex.py +++ b/db_mutex/db_mutex.py @@ -4,7 +4,9 @@ from django.conf import settings from django.db import transaction, IntegrityError - +from django.core.exceptions import ObjectDoesNotExist +from django.utils import timezone + from .exceptions import DBMutexError, DBMutexTimeoutError from .models import DBMutex @@ -91,8 +93,8 @@ def __call__(self, func): def __enter__(self): self.start() - def __exit__(self, *args): - self.stop() + def __exit__(self, type, value, traceback): + return self.stop(type, value, traceback) def start(self): """ @@ -107,14 +109,23 @@ def start(self): except IntegrityError: raise DBMutexError('Could not acquire lock: {0}'.format(self.lock_id)) - def stop(self): + def stop(self, type, value, traceback): """ Releases the db mutex lock. Throws an error if the lock was released before the function finished. """ - if not DBMutex.objects.filter(id=self.lock.id).exists(): - raise DBMutexTimeoutError('Lock {0} expired before function completed'.format(self.lock_id)) - else: + ttl_seconds = self.get_mutex_ttl_seconds() + + try : + dbmutex = DBMutex.objects.get(id=self.lock.id) self.lock.delete() + except ObjectDoesNotExist: + dbmutex = None + + if value : + return #Any exception takes precedence over DBMutexTimeoutError + + if not dbmutex or (ttl_seconds and dbmutex.creation_time <= timezone.now() - timedelta(seconds=ttl_seconds)): + raise DBMutexTimeoutError('Lock {0} expired before function completed'.format(self.lock_id)) def decorate_callable(self, func): """ From 30c8d950ec937359a1c80933d5f985c6447522ea Mon Sep 17 00:00:00 2001 From: pyMan Date: Wed, 9 Mar 2016 08:53:05 +0100 Subject: [PATCH 2/2] Fixed some flake8 error Just left some pre existing "line too long" --- db_mutex/db_mutex.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/db_mutex/db_mutex.py b/db_mutex/db_mutex.py index aa1c1d3..df0676b 100644 --- a/db_mutex/db_mutex.py +++ b/db_mutex/db_mutex.py @@ -6,7 +6,7 @@ from django.db import transaction, IntegrityError from django.core.exceptions import ObjectDoesNotExist from django.utils import timezone - + from .exceptions import DBMutexError, DBMutexTimeoutError from .models import DBMutex @@ -114,16 +114,16 @@ def stop(self, type, value, traceback): Releases the db mutex lock. Throws an error if the lock was released before the function finished. """ ttl_seconds = self.get_mutex_ttl_seconds() - - try : + + try: dbmutex = DBMutex.objects.get(id=self.lock.id) self.lock.delete() - except ObjectDoesNotExist: + except ObjectDoesNotExist: dbmutex = None - - if value : - return #Any exception takes precedence over DBMutexTimeoutError - + + if value: + return # Any exception takes precedence over DBMutexTimeoutError + if not dbmutex or (ttl_seconds and dbmutex.creation_time <= timezone.now() - timedelta(seconds=ttl_seconds)): raise DBMutexTimeoutError('Lock {0} expired before function completed'.format(self.lock_id))