def iter(self, result, exc_info, start_time):  # noqa
        fut = Future(self.statistics['attempt_number'])
        if result is not NO_RESULT:
            trial_end_time = _utils.now()
            fut.set_result(result)
            retry = self.retry(fut)
        elif exc_info:
            trial_end_time = _utils.now()
            t, e, tb = exc_info
            _utils.capture(fut, exc_info)
            if isinstance(e, TryAgain):
                retry = True
            else:
                retry = self.retry(fut)
        else:
            if self.before is not None:
                self.before(self.fn, self.statistics['attempt_number'])

            return DoAttempt()

        if not retry:
            return fut.result()

        if self.after is not None:
            trial_time_taken = trial_end_time - start_time
            self.after(self.fn, self.statistics['attempt_number'],
                       trial_time_taken)

        delay_since_first_attempt = (_utils.now() -
                                     self.statistics['start_time'])
        self.statistics['delay_since_first_attempt'] = \
            delay_since_first_attempt
        if self.stop(self.statistics['attempt_number'],
                     delay_since_first_attempt):
            if self.retry_error_callback:
                return self.retry_error_callback(fut)
            retry_exc = self.retry_error_cls(fut)
            if self.reraise:
                raise retry_exc.reraise()
            six.raise_from(retry_exc, fut.exception())

        if self.wait:
            if self._wait_takes_result:
                sleep = self.wait(self.statistics['attempt_number'],
                                  delay_since_first_attempt,
                                  last_result=fut)
            else:
                sleep = self.wait(self.statistics['attempt_number'],
                                  delay_since_first_attempt)
        else:
            sleep = 0
        self.statistics['idle_for'] += sleep
        self.statistics['attempt_number'] += 1

        if self.before_sleep is not None:
            self.before_sleep(self, sleep=sleep, last_result=fut)

        return DoSleep(sleep)
Exemple #2
0
    def call(self, fn, *args, **kwargs):
        self.statistics.clear()
        start_time = now()
        self.statistics['start_time'] = start_time
        attempt_number = 1
        self.statistics['attempt_number'] = attempt_number
        self.statistics['idle_for'] = 0
        while True:
            trial_start_time = now()
            if self.before is not None:
                self.before(fn, attempt_number)

            fut = Future(attempt_number)
            try:
                result = fn(*args, **kwargs)
            except TryAgain:
                trial_end_time = now()
                retry = True
            except Exception:
                trial_end_time = now()
                tb = sys.exc_info()
                try:
                    _utils.capture(fut, tb)
                finally:
                    del tb
                retry = self.retry(fut)
            else:
                trial_end_time = now()
                fut.set_result(result)
                retry = self.retry(fut)

            if not retry:
                return fut.result()

            if self.after is not None:
                trial_time_taken = trial_end_time - trial_start_time
                self.after(fn, attempt_number, trial_time_taken)

            delay_since_first_attempt = now() - start_time
            self.statistics['delay_since_first_attempt'] = \
                delay_since_first_attempt
            if self.stop(attempt_number, delay_since_first_attempt):
                if self.reraise:
                    raise RetryError(fut).reraise()
                six.raise_from(RetryError(fut), fut.exception())

            if self.wait:
                sleep = self.wait(attempt_number, delay_since_first_attempt)
            else:
                sleep = 0
            self.statistics['idle_for'] += sleep
            self.sleep(sleep)

            attempt_number += 1
            self.statistics['attempt_number'] = attempt_number
Exemple #3
0
    def iter(self, result, exc_info, start_time):
        fut = Future(self.statistics['attempt_number'])
        if result is not NO_RESULT:
            trial_end_time = now()
            fut.set_result(result)
            retry = self.retry(fut)
        elif exc_info:
            trial_end_time = now()
            t, e, tb = exc_info
            _utils.capture(fut, exc_info)
            if isinstance(e, TryAgain):
                retry = True
            else:
                retry = self.retry(fut)
        else:
            if self.before is not None:
                self.before(self.fn, self.statistics['attempt_number'])

            return DoAttempt()

        if not retry:
            return fut.result()

        if self.after is not None:
            trial_time_taken = trial_end_time - start_time
            self.after(self.fn, self.statistics['attempt_number'],
                       trial_time_taken)

        delay_since_first_attempt = now() - self.statistics['start_time']
        self.statistics['delay_since_first_attempt'] = \
            delay_since_first_attempt
        if self.stop(self.statistics['attempt_number'],
                     delay_since_first_attempt):
            if self.reraise:
                raise RetryError(fut).reraise()
            six.raise_from(RetryError(fut), fut.exception())

        if self.wait:
            sleep = self.wait(self.statistics['attempt_number'],
                              delay_since_first_attempt)
        else:
            sleep = 0
        self.statistics['idle_for'] += sleep
        self.statistics['attempt_number'] += 1

        return DoSleep(sleep)
Exemple #4
0
 def set_exception(self, exc_info):
     ts = _utils.now()
     fut = Future(self.attempt_number)
     _utils.capture(fut, exc_info)
     self.outcome, self.outcome_timestamp = fut, ts