blob: 466396a3b9199c1b49089bf833f0088dfbabbf3b [file] [log] [blame]
#!/usr/bin/env python
from __future__ import print_function
import traceback
import logging
import time
import random
import sys
def retry(ExceptionToCheck, tries=10, timeout_secs=1.0, logger=None):
"""
Retry calling the decorated function using an exponential backoff.
"""
def deco_retry(f):
def f_retry(*args, **kwargs):
mtries, mdelay = tries, timeout_secs
while mtries > 1:
try:
return f(*args, **kwargs)
except ExceptionToCheck as e:
#traceback.print_exc()
half_interval = mdelay * 0.10 #interval size
actual_delay = random.uniform(mdelay - half_interval, mdelay + half_interval)
msg = "Retrying in %.2f seconds ..." % actual_delay
if logger is None:
logging.exception(msg)
else:
logger.exception(msg)
time.sleep(actual_delay)
mtries -= 1
mdelay *= 2
return f(*args, **kwargs)
return f_retry # true decorator
return deco_retry