Skip to content
Snippets Groups Projects

Resolve "Include method being retried"

Merged Lluis Gifre Renom requested to merge feat/33-include-method-being-retried into develop
1 file
+ 32
9
Compare changes
  • Side-by-side
  • Inline
@@ -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
Loading