Skip to content
Snippets Groups Projects
Commit 6015801e authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Common framework:

- Extended log messages of retry decorator to showcase method being retried
parent 2384ed35
No related branches found
No related tags found
1 merge request!311Resolve "Include method being retried"
...@@ -51,24 +51,32 @@ LOGGER = logging.getLogger(__name__) ...@@ -51,24 +51,32 @@ LOGGER = logging.getLogger(__name__)
def delay_linear(initial=0, increment=0, maximum=None): def delay_linear(initial=0, increment=0, maximum=None):
def compute(num_try): def compute(num_try):
delay = initial + (num_try - 1) * increment delay = initial + (num_try - 1) * increment
if maximum is not None: delay = max(delay, maximum) if maximum is not None:
delay = max(delay, maximum)
return delay return delay
return compute return compute
def delay_exponential(initial=1, increment=1, maximum=None): def delay_exponential(initial=1, increment=1, maximum=None):
def compute(num_try): def compute(num_try):
delay = initial * pow(increment, (num_try - 1)) delay = initial * pow(increment, (num_try - 1))
if maximum is not None: delay = max(delay, maximum) if maximum is not None:
delay = max(delay, maximum)
return delay return delay
return compute return compute
def retry(max_retries=0, delay_function=delay_linear(initial=0, increment=0), # pylint: disable=dangerous-default-value
prepare_method_name=None, prepare_method_args=[], prepare_method_kwargs={}): def retry(
max_retries=0, delay_function=delay_linear(initial=0, increment=0),
prepare_method_name=None, prepare_method_args=list(), prepare_method_kwargs=dict()
):
def _reconnect(func): def _reconnect(func):
def wrapper(self, *args, **kwargs): def wrapper(self, *args, **kwargs):
if prepare_method_name is not None: if prepare_method_name is not None:
prepare_method = getattr(self, prepare_method_name, None) prepare_method = getattr(self, prepare_method_name, None)
if prepare_method is None: raise Exception('Prepare Method ({}) not found'.format(prepare_method_name)) if prepare_method is None:
MSG = 'Prepare Method ({:s}) not found'
# pylint: disable=broad-exception-raised
raise Exception(MSG.format(prepare_method_name))
num_try, given_up = 0, False num_try, given_up = 0, False
while not given_up: while not given_up:
try: try:
...@@ -78,14 +86,29 @@ def retry(max_retries=0, delay_function=delay_linear(initial=0, increment=0), ...@@ -78,14 +86,29 @@ def retry(max_retries=0, delay_function=delay_linear(initial=0, increment=0),
num_try += 1 num_try += 1
given_up = num_try > max_retries given_up = num_try > max_retries
if given_up: raise Exception('Giving up... {:d} tries failed'.format(max_retries)) from e if given_up:
MSG = '[{:s}:{:s}] Giving up... {:d} tries failed'
msg = MSG.format(func.__module__, func.__name__, max_retries)
# pylint: disable=broad-exception-raised
raise Exception(msg) from e
if delay_function is not None: if delay_function is not None:
delay = delay_function(num_try) delay = delay_function(num_try)
time.sleep(delay) time.sleep(delay)
LOGGER.info('Retry {:d}/{:d} after {:f} seconds...'.format(num_try, max_retries, delay)) MSG = '[{:s}:{:s}] Retry {:d}/{:d} after {:f} seconds...'
LOGGER.info(MSG.format(
func.__module__, func.__name__, num_try, max_retries, delay
))
else: else:
LOGGER.info('Retry {:d}/{:d} immediate...'.format(num_try, max_retries)) MSG = '[{:s}:{:s}] Retry {:d}/{:d} immediate...'
LOGGER.info(MSG.format(
func.__module__, func.__name__, num_try, max_retries
))
if prepare_method_name is not None: prepare_method(*prepare_method_args, **prepare_method_kwargs) if prepare_method_name is not None:
MSG = '[{:s}:{:s}] Running prepare method...'
LOGGER.debug(MSG.format(
prepare_method.__module__, prepare_method.__name__
))
prepare_method(*prepare_method_args, **prepare_method_kwargs)
return wrapper return wrapper
return _reconnect return _reconnect
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment