Skip to content

Commit ced5094

Browse files
feat: retry requests on 502 responses (#382)
1 parent c198e38 commit ced5094

2 files changed

Lines changed: 31 additions & 1 deletion

File tree

codecov_cli/helpers/request.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,27 @@ def backoff_time(curr_retry):
4747
return 2 ** (curr_retry - 1)
4848

4949

50+
class RetryException(Exception):
51+
...
52+
53+
5054
def retry_request(func):
5155
def wrapper(*args, **kwargs):
5256
retry = 0
5357
while retry < MAX_RETRIES:
5458
try:
55-
return func(*args, **kwargs)
59+
response = func(*args, **kwargs)
60+
if response.status_code == 502:
61+
logger.warning(
62+
"Response status code was 502.",
63+
extra=dict(extra_log_attributes=dict(retry=retry)),
64+
)
65+
raise RetryException
66+
return response
5667
except (
5768
requests.exceptions.ConnectionError,
5869
requests.exceptions.Timeout,
70+
RetryException,
5971
) as exp:
6072
logger.warning(
6173
"Request failed. Retrying",

tests/helpers/test_upload_sender.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
import re
23
from pathlib import Path
34

45
import pytest
@@ -304,6 +305,23 @@ def test_upload_sender_result_fail_post_400(
304305

305306
assert sender.warnings is not None
306307

308+
def test_upload_sender_result_fail_post_502(
309+
self, mocker, mocked_responses, mocked_legacy_upload_endpoint, capsys
310+
):
311+
mocker.patch("codecov_cli.helpers.request.sleep")
312+
mocked_legacy_upload_endpoint.status = 502
313+
314+
with pytest.raises(Exception, match="Request failed after too many retries"):
315+
_ = UploadSender().send_upload_data(
316+
upload_collection, random_sha, random_token, **named_upload_data
317+
)
318+
319+
matcher = re.compile(
320+
r"(warning.*((Response status code was 502)|(Request failed\. Retrying)).*(\n)?){6}"
321+
)
322+
323+
assert matcher.match(capsys.readouterr().err) is not None
324+
307325
def test_upload_sender_result_fail_put_400(
308326
self, mocked_responses, mocked_legacy_upload_endpoint, mocked_storage_server
309327
):

0 commit comments

Comments
 (0)