Beispiel #1
0
 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))
Beispiel #2
0
    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)
Beispiel #3
0
        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)
Beispiel #4
0
        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()
Beispiel #5
0
        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)
Beispiel #6
0
    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