Source code for alibabacloud_oss_v2.retry.retryer_impl

"""Modules for retryer """
from typing import Optional, List
from ..types import Retryer
from .. import defaults
from . import error_retryable
from . import backoff

_default_error_retryables = [
    error_retryable.HTTPStatusCodeRetryable(),
    error_retryable.ServiceErrorCodeRetryable(),
    error_retryable.ClientErrorRetryable()
]


[docs] class NopRetryer(Retryer): """nop retryer"""
[docs] def is_error_retryable(self, error: Exception) -> bool: return False
[docs] def max_attempts(self) -> int: return 1
[docs] def retry_delay(self, attempt: int, error: Exception) -> float: raise NotImplementedError()
[docs] class StandardRetryer(Retryer): """standard retryer""" def __init__( self, max_attempts: Optional[int] = None, max_backoff: Optional[float] = None, base_delay: Optional[float] = None, error_retryables: Optional[List[error_retryable.ErrorRetryable]] = None, backoff_delayer: Optional[backoff.BackoffDelayer] = None, ) -> None: """ Args: max_attempts (int, optional): max retry attempt max_backoff (float, optional): the max duration in second. base_delay (float, optional): the base delay duration in second. error_retryables ([ErrorRetryable], optional): error retryables list. backoff_delayer ([BackoffDelayer], optional): backoff delayer. """ super().__init__() self._max_attempts = max_attempts or defaults.DEFAULT_MAX_ATTEMPTS self._max_backoff = max_backoff or defaults.DEFAULT_MAX_BACKOFF_S self._base_delay = base_delay or defaults.DEFAULT_BASE_DELAY_S self._error_retryables = error_retryables or _default_error_retryables if backoff_delayer is None: backoff_delayer = backoff.FullJitterBackoff( self._base_delay, self._max_backoff) self._backoff_delayer = backoff_delayer
[docs] def is_error_retryable(self, error: Exception) -> bool: for r in self._error_retryables: if r.is_error_retryable(error): return True return False
[docs] def max_attempts(self) -> int: return self._max_attempts
[docs] def retry_delay(self, attempt: int, error: Exception) -> float: return self._backoff_delayer.backoff_delay(attempt, error)