Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit f939980

Browse filesBrowse files
authored
Merge pull request influxdata#435 from xginn8/define_retries (Thanks @xginn8!)
Allow user-configurable number of retries when submitting request to …
2 parents 8e02ea8 + 74ce644 commit f939980
Copy full SHA for f939980

File tree

Expand file treeCollapse file tree

3 files changed

+84
-14
lines changed
Filter options
Expand file treeCollapse file tree

3 files changed

+84
-14
lines changed

‎influxdb/client.py

Copy file name to clipboardExpand all lines: influxdb/client.py
+15-7Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ class InfluxDBClient(object):
5353
:param timeout: number of seconds Requests will wait for your client to
5454
establish a connection, defaults to None
5555
:type timeout: int
56+
:param retries: number of retries your client will try before aborting,
57+
defaults to 3. 0 indicates try until success
58+
:type retries: int
5659
:param use_udp: use UDP to connect to InfluxDB, defaults to False
5760
:type use_udp: bool
5861
:param udp_port: UDP port to connect to InfluxDB, defaults to 4444
@@ -70,6 +73,7 @@ def __init__(self,
7073
ssl=False,
7174
verify_ssl=False,
7275
timeout=None,
76+
retries=3,
7377
use_udp=False,
7478
udp_port=4444,
7579
proxies=None,
@@ -81,6 +85,7 @@ def __init__(self,
8185
self._password = password
8286
self._database = database
8387
self._timeout = timeout
88+
self._retries = retries
8489

8590
self._verify_ssl = verify_ssl
8691

@@ -225,9 +230,10 @@ def request(self, url, method='GET', params=None, data=None,
225230
if isinstance(data, (dict, list)):
226231
data = json.dumps(data)
227232

228-
# Try to send the request a maximum of three times. (see #103)
229-
# TODO (aviau): Make this configurable.
230-
for i in range(0, 3):
233+
# Try to send the request more than once by default (see #103)
234+
retry = True
235+
_try = 0
236+
while retry:
231237
try:
232238
response = self._session.request(
233239
method=method,
@@ -242,10 +248,12 @@ def request(self, url, method='GET', params=None, data=None,
242248
)
243249
break
244250
except requests.exceptions.ConnectionError as e:
245-
if i < 2:
246-
continue
247-
else:
248-
raise e
251+
_try += 1
252+
if self._retries != 0:
253+
retry = _try < self._retries
254+
255+
else:
256+
raise requests.exceptions.ConnectionError
249257

250258
if 500 <= response.status_code < 600:
251259
raise InfluxDBServerError(response.content)

‎influxdb/influxdb08/client.py

Copy file name to clipboardExpand all lines: influxdb/influxdb08/client.py
+14-7Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ class InfluxDBClient(object):
5555
:param verify_ssl: verify SSL certificates for HTTPS requests, defaults is
5656
False
5757
:type verify_ssl: boolean
58+
:param retries: number of retries your client will try before aborting,
59+
defaults to 3. 0 indicates try until success
60+
:type retries: int
5861
:param timeout: number of seconds Requests will wait for your client to
5962
establish a connection, defaults to None
6063
:type timeout: int
@@ -73,6 +76,7 @@ def __init__(self,
7376
ssl=False,
7477
verify_ssl=False,
7578
timeout=None,
79+
retries=3,
7680
use_udp=False,
7781
udp_port=4444):
7882
"""
@@ -84,6 +88,7 @@ def __init__(self,
8488
self._password = password
8589
self._database = database
8690
self._timeout = timeout
91+
self._retries = retries
8792

8893
self._verify_ssl = verify_ssl
8994

@@ -228,9 +233,10 @@ def request(self, url, method='GET', params=None, data=None,
228233
if data is not None and not isinstance(data, str):
229234
data = json.dumps(data)
230235

231-
# Try to send the request a maximum of three times. (see #103)
232-
# TODO (aviau): Make this configurable.
233-
for i in range(0, 3):
236+
retry = True
237+
_try = 0
238+
# Try to send the request more than once by default (see #103)
239+
while retry:
234240
try:
235241
response = session.request(
236242
method=method,
@@ -244,10 +250,11 @@ def request(self, url, method='GET', params=None, data=None,
244250
break
245251
except (requests.exceptions.ConnectionError,
246252
requests.exceptions.Timeout) as e:
247-
if i < 2:
248-
continue
249-
else:
250-
raise e
253+
_try += 1
254+
if self._retries != 0:
255+
retry = _try < self._retries
256+
else:
257+
raise requests.exceptions.ConnectionError
251258

252259
if response.status_code == expected_response_code:
253260
return response

‎influxdb/tests/client_test.py

Copy file name to clipboardExpand all lines: influxdb/tests/client_test.py
+55Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,61 @@ def connection_error(self, *args, **kwargs):
645645
with self.assertRaises(requests.exceptions.ConnectionError):
646646
cli.write_points(self.dummy_points)
647647

648+
@mock.patch('requests.Session.request')
649+
def test_random_request_retry(self, mock_request):
650+
"""Tests that a random number of connection errors will be handled"""
651+
652+
class CustomMock(object):
653+
def __init__(self, retries):
654+
self.i = 0
655+
self.retries = retries
656+
657+
def connection_error(self, *args, **kwargs):
658+
self.i += 1
659+
660+
if self.i < self.retries:
661+
raise requests.exceptions.ConnectionError
662+
else:
663+
r = requests.Response()
664+
r.status_code = 204
665+
return r
666+
667+
retries = random.randint(1, 100)
668+
mock_request.side_effect = CustomMock(retries).connection_error
669+
670+
cli = InfluxDBClient(database='db', retries=retries)
671+
cli.write_points(
672+
self.dummy_points
673+
)
674+
675+
@mock.patch('requests.Session.request')
676+
def test_random_request_retry_raises(self, mock_request):
677+
"""Tests that a random number of connection errors plus one \
678+
will not be handled"""
679+
680+
class CustomMock(object):
681+
def __init__(self, retries):
682+
self.i = 0
683+
self.retries = retries
684+
685+
def connection_error(self, *args, **kwargs):
686+
self.i += 1
687+
688+
if self.i < self.retries + 1:
689+
raise requests.exceptions.ConnectionError
690+
else:
691+
r = requests.Response()
692+
r.status_code = 200
693+
return r
694+
695+
retries = random.randint(1, 100)
696+
mock_request.side_effect = CustomMock(retries).connection_error
697+
698+
cli = InfluxDBClient(database='db', retries=retries)
699+
700+
with self.assertRaises(requests.exceptions.ConnectionError):
701+
cli.write_points(self.dummy_points)
702+
648703
def test_get_list_users(self):
649704
example_response = (
650705
'{"results":[{"series":[{"columns":["user","admin"],'

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.