import arvados.errors
_HTTP_SUCCESSES = set(range(200, 300))
-_HTTP_CAN_RETRY = set([408, 409, 422, 423, 500, 502, 503, 504])
+_HTTP_CAN_RETRY = set([408, 409, 423, 500, 502, 503, 504])
class RetryLoop(object):
"""Coordinate limited retries of code.
* Any 2xx result returns `True`.
* A select few status codes, or any malformed responses, return `None`.
- 422 Unprocessable Entity is in this category. This may not meet the
- letter of the HTTP specification, but the Arvados API server will
- use it for various server-side problems like database connection
- errors.
* Everything else returns `False`. Note that this includes 1xx and
3xx status codes. They don't indicate success, and you can't
class ArvadosApiTest(run_test_server.TestCaseWithServers):
MAIN_SERVER = {}
ERROR_HEADERS = {'Content-Type': mimetypes.types_map['.json']}
- RETRIED_4XX = frozenset([408, 409, 422, 423])
+ RETRIED_4XX = frozenset([408, 409, 423])
def api_error_response(self, code, *errors):
return (fake_httplib2_response(code, **self.ERROR_HEADERS),
def test_4xx_not_retried(self):
client = arvados.api('v1', num_retries=3)
- for code in [400, 401, 404]:
+ for code in [400, 401, 404, 422]:
with self.subTest(f'error {code}'), mock.patch('time.sleep'):
with mock_api_responses(
client,
self.check_is(True, *list(range(200, 207)))
def test_obvious_stops(self):
- self.check_is(False, 424, 426, 428, 431,
+ self.check_is(False, 422, 424, 426, 428, 431,
*list(range(400, 408)) + list(range(410, 420)))
def test_obvious_retries(self):
self.check_is(None, 500, 502, 503, 504)
def test_4xx_retries(self):
- self.check_is(None, 408, 409, 422, 423)
+ self.check_is(None, 408, 409, 423)
def test_5xx_failures(self):
self.check_is(False, 501, *list(range(505, 512)))