32 lines
1.0 KiB
Python
32 lines
1.0 KiB
Python
import logging
|
|
import time
|
|
from typing import Any
|
|
|
|
from t_tech.invest.logging import get_metadata_from_call
|
|
from t_tech.invest.retrying.base_retry_manager import BaseRetryManager
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class RetryManager(BaseRetryManager):
|
|
def call_with_retries(self, call: Any):
|
|
retries_left = self.get_initial_retries()
|
|
while retries_left > 0:
|
|
logger.debug("Trying to call")
|
|
result = call()
|
|
logger.debug("Call succeeded")
|
|
exception = result.exception()
|
|
if not exception:
|
|
return result
|
|
retries_left -= 1
|
|
logger.debug("Retries left = %s", retries_left)
|
|
metadata = get_metadata_from_call(exception)
|
|
seconds_to_sleep = self.extract_seconds_to_sleep(metadata)
|
|
self._sleep(seconds_to_sleep)
|
|
|
|
logger.debug("RetryManager exhausted, no retries left")
|
|
return result
|
|
|
|
def _sleep(self, seconds_to_sleep):
|
|
time.sleep(seconds_to_sleep)
|