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)
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
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)
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