def lock(flow_class, process_pk): for i in range(attempts): with transaction.atomic(): try: process = flow_class.process_class._default_manager.filter(pk=process_pk) if not process.select_for_update(nowait=nowait).exists(): raise DatabaseError('Process not exists') yield break except DatabaseError: if i != attempts - 1: sleep_time = (((i + 1) * random.random()) + 2 ** i) / 2.5 time.sleep(sleep_time) else: raise FlowLockFailed('Lock failed for {}'.format(flow_class))
def lock(flow_cls, process_pk): key = 'django-viewflow-lock-{}/{}'.format(flow_cls._meta.namespace, process_pk) for i in range(attempts): stored = cache.add(key, 1, expires) if stored: break if i != attempts - 1: sleep_time = (((i + 1) * random.random()) + 2**i) / 2.5 time.sleep(sleep_time) else: raise FlowLockFailed('Lock failed for {}'.format(flow_cls)) with transaction.atomic(): yield cache.delete(key)
def lock(flow_class, process_pk): key = 'django-viewflow-lock-{}/{}'.format( flow_class._meta.flow_label, process_pk) for i in range(self.attempts): if self.cache.add(key, 1, self.expires): break if i != self.attempts - 1: sleep_time = (((i + 1) * random.random()) + 2**i) / 2.5 time.sleep(sleep_time) else: raise FlowLockFailed('Lock failed for {}'.format(flow_class)) try: with transaction.atomic(): yield finally: self.cache.delete(key)
def lock(flow_cls, process_pk): key = 'django-viewflow-lock-{}/{}'.format(flow_cls._meta.namespace, process_pk) for i in range(attempts): lock = cache.lock(key, timeout=expires) stored = lock.acquire(blocking=False) if stored: break if i != attempts - 1: sleep_time = (((i + 1) * random.random()) + 2**i) / 2.5 time.sleep(sleep_time) else: raise FlowLockFailed('Lock failed for {}'.format(flow_cls)) try: with transaction.atomic(): yield finally: lock.release()
def lock(flow_class, process_pk): key = 'django-viewflow-lock-{}/{}'.format(flow_class._meta.flow_label, process_pk) for i in range(attempts): process = flow_class.process_class._default_manager.filter(pk=process_pk) if process.exists(): stored = cache.add(key, 1, expires) if stored: break if i != attempts - 1: sleep_time = (((i + 1) * random.random()) + 2 ** i) / 2.5 time.sleep(sleep_time) else: raise FlowLockFailed('Lock failed for {}'.format(flow_class)) try: with transaction.atomic(): yield finally: cache.delete(key)
def lock(flow_cls, process_pk): assert transaction.get_autocommit( ) or transaction.commit.__module__ == 'django.test.testcases' with transaction.atomic(): for i in range(attempts): try: flow_cls.process_cls._default_manager \ .filter(pk=process_pk) \ .select_for_update(nowait=nowait) \ .exists() break except DatabaseError: if i != attempts - 1: sleep_time = (((i + 1) * random.random()) + 2**i) / 2.5 time.sleep(sleep_time) else: raise FlowLockFailed( 'Lock failed for {}'.format(flow_cls)) yield