Skip to content

Commit 067e147

Browse files
committed
Playing with retries.
1 parent bbf5053 commit 067e147

2 files changed

Lines changed: 48 additions & 0 deletions

File tree

system_tests/bigquery.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from gcloud.environment_vars import TESTS_PROJECT
2222
from gcloud import bigquery
2323

24+
from retry import retry
2425
from system_test_utils import unique_resource_id
2526

2627

@@ -81,6 +82,7 @@ def test_patch_dataset(self):
8182
self.assertEqual(dataset.friendly_name, 'Friendly')
8283
self.assertEqual(dataset.description, 'Description')
8384

85+
@retry(Exception, tries=3, delay=30)
8486
def test_update_dataset(self):
8587
dataset = Config.CLIENT.dataset(DATASET_NAME)
8688
self.assertFalse(dataset.exists())
@@ -185,6 +187,7 @@ def test_patch_table(self):
185187
self.assertEqual(table.friendly_name, 'Friendly')
186188
self.assertEqual(table.description, 'Description')
187189

190+
@retry(Exception, tries=3, delay=20)
188191
def test_update_table(self):
189192
dataset = Config.CLIENT.dataset(DATASET_NAME)
190193
self.assertFalse(dataset.exists())

system_tests/retry.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import time
2+
from functools import wraps
3+
4+
5+
def retry(ExceptionToCheck, tries=4, delay=3, backoff=2, logger=None):
6+
"""Retry calling the decorated function using an exponential backoff.
7+
8+
http://www.saltycrane.com/blog/2009/11/trying-out-retry-decorator-python/
9+
original from: http://wiki.python.org/moin/PythonDecoratorLibrary#Retry
10+
11+
:param ExceptionToCheck: the exception to check. may be a tuple of
12+
exceptions to check
13+
:type ExceptionToCheck: Exception or tuple
14+
:param tries: number of times to try (not retry) before giving up
15+
:type tries: int
16+
:param delay: initial delay between retries in seconds
17+
:type delay: int
18+
:param backoff: backoff multiplier e.g. value of 2 will double the delay
19+
each retry
20+
:type backoff: int
21+
:param logger: logger to use. If None, print
22+
:type logger: logging.Logger instance
23+
"""
24+
def deco_retry(f):
25+
26+
@wraps(f)
27+
def f_retry(*args, **kwargs):
28+
mtries, mdelay = tries, delay
29+
while mtries > 1:
30+
try:
31+
return f(*args, **kwargs)
32+
except ExceptionToCheck as e:
33+
msg = "%s, Retrying in %d seconds..." % (str(e), mdelay)
34+
if logger:
35+
logger.warning(msg)
36+
else:
37+
print(msg)
38+
time.sleep(mdelay)
39+
mtries -= 1
40+
mdelay *= backoff
41+
return f(*args, **kwargs)
42+
43+
return f_retry # true decorator
44+
45+
return deco_retry

0 commit comments

Comments
 (0)