diff options
author | Zuul <zuul@review.opendev.org> | 2022-08-19 00:43:25 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2022-08-19 00:43:25 +0000 |
commit | c1f5e8b7c19b90097aecaa89c028f698cf4d804e (patch) | |
tree | ddf74ffdda586d7fd360c1d78b53a5be7e76abf1 | |
parent | 3b30f155a7ed6e1f66ff6d0272c4216bee543b88 (diff) | |
parent | 653cbcb686fc34cc28f9c7889e8746e77b95371a (diff) | |
download | python-swiftclient-c1f5e8b7c19b90097aecaa89c028f698cf4d804e.tar.gz |
Merge "Expand retry handling on ratelimit response"
-rw-r--r-- | swiftclient/client.py | 2 | ||||
-rw-r--r-- | test/unit/test_swiftclient.py | 54 |
2 files changed, 31 insertions, 25 deletions
diff --git a/swiftclient/client.py b/swiftclient/client.py index 9c19306..e42ac70 100644 --- a/swiftclient/client.py +++ b/swiftclient/client.py @@ -1825,7 +1825,7 @@ class Connection: self.http_conn = None elif 500 <= err.http_status <= 599: pass - elif self.retry_on_ratelimit and err.http_status == 498: + elif self.retry_on_ratelimit and err.http_status in (498, 429): pass else: raise diff --git a/test/unit/test_swiftclient.py b/test/unit/test_swiftclient.py index 436245d..ae3e76f 100644 --- a/test/unit/test_swiftclient.py +++ b/test/unit/test_swiftclient.py @@ -2130,31 +2130,37 @@ class TestConnection(MockHttpTest): pass c.sleep = quick_sleep - # test retries - conn = c.Connection('http://www.test.com/auth/v1.0', 'asdf', 'asdf', - retry_on_ratelimit=True) - code_iter = [200] + [498] * (conn.retries + 1) - auth_resp_headers = { - 'x-auth-token': 'asdf', - 'x-storage-url': 'http://storage/v1/test', - } - c.http_connection = self.fake_http_connection( - *code_iter, headers=auth_resp_headers) - with self.assertRaises(c.ClientException) as exc_context: - conn.head_account() - self.assertIn('Account HEAD failed', str(exc_context.exception)) - self.assertEqual(conn.attempts, conn.retries + 1) + def test_status_code(code): + # test retries + conn = c.Connection('http://www.test.com/auth/v1.0', + 'asdf', 'asdf', retry_on_ratelimit=True) + code_iter = [200] + [code] * (conn.retries + 1) + auth_resp_headers = { + 'x-auth-token': 'asdf', + 'x-storage-url': 'http://storage/v1/test', + } + c.http_connection = self.fake_http_connection( + *code_iter, headers=auth_resp_headers) + with self.assertRaises(c.ClientException) as exc_context: + conn.head_account() + self.assertIn('Account HEAD failed', str(exc_context.exception)) + self.assertEqual(code, exc_context.exception.http_status) + self.assertEqual(conn.attempts, conn.retries + 1) - # test default no-retry - c.http_connection = self.fake_http_connection( - 200, 498, - headers=auth_resp_headers) - conn = c.Connection('http://www.test.com/auth/v1.0', 'asdf', 'asdf', - retry_on_ratelimit=False) - with self.assertRaises(c.ClientException) as exc_context: - conn.head_account() - self.assertIn('Account HEAD failed', str(exc_context.exception)) - self.assertEqual(conn.attempts, 1) + # test default no-retry + c.http_connection = self.fake_http_connection( + 200, code, + headers=auth_resp_headers) + conn = c.Connection('http://www.test.com/auth/v1.0', + 'asdf', 'asdf', retry_on_ratelimit=False) + with self.assertRaises(c.ClientException) as exc_context: + conn.head_account() + self.assertIn('Account HEAD failed', str(exc_context.exception)) + self.assertEqual(code, exc_context.exception.http_status) + self.assertEqual(conn.attempts, 1) + + test_status_code(498) + test_status_code(429) def test_retry_with_socket_error(self): def quick_sleep(*args): |