Skip to content

Commit 8fb8c6f

Browse files
author
wallisyan
committed
modify retry logic
1 parent ffb7f66 commit 8fb8c6f

File tree

5 files changed

+67
-61
lines changed

5 files changed

+67
-61
lines changed

aliyun-python-sdk-core/alibabacloud/client.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
TimeoutConfigReader, # 获取timeout
3535
EndpointHandler, # 获取endpoint
3636
LogHandler,
37-
# RetryHandler,
37+
RetryHandler,
3838
ServerErrorHandler,
3939
HttpHandler
4040
]
@@ -76,18 +76,18 @@ def __init__(self, access_key_id=None, access_key_secret=None, bearer_token=None
7676
self.https_port = https_port
7777
self.connection_timeout = connection_timeout
7878
self.read_timeout = read_timeout
79+
self.enable_stream_logger = enable_stream_logger
80+
self.profile_name = profile_name
81+
self.config_file = config_file
7982
# self.enable_http_debug = enable_http_debug # http-debug 只从环境变量获取
8083
self.http_debug = None
8184
# proxy provider两个: client env
8285
self.http_proxy = http_proxy
8386
self.https_proxy = https_proxy
8487
self._proxy = {
85-
'http': http_proxy,
86-
'https': https_proxy,
88+
'http': self.http_proxy,
89+
'https': self.https_proxy,
8790
}
88-
self.enable_stream_logger = enable_stream_logger
89-
self.profile_name = profile_name
90-
self.config_file = config_file
9191
# retry
9292
self._auto_retry = auto_retry
9393
import aliyunsdkcore.retry.retry_policy as retry_policy
@@ -191,17 +191,16 @@ def handle_request(self, api_request, request_handlers=None, context=None):
191191

192192
if not request_handlers:
193193
request_handlers = self.handlers
194-
195194
for i in range(len(request_handlers)):
196195
request_handlers[i]().handle_request(context)
197196

198197
for i in reversed(range(len(request_handlers))):
199198
request_handlers[i]().handle_response(context)
200-
# if context.retry_flag:
201-
# time.sleep(context.retry_backoff)
202-
# self.handle_request(api_request,
203-
# request_handlers=request_handlers[i:],
204-
# context=context)
199+
if context.retry_flag:
200+
time.sleep(context.retry_backoff / 1000.0)
201+
self.handle_request(api_request,
202+
request_handlers=request_handlers[i:],
203+
context=context)
205204
if context.exception:
206205
return context.exception
207206

aliyun-python-sdk-core/alibabacloud/handlers/http_handler.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ def do_request(context):
6363
current_protocol = 'http://' if http_request.protocol.lower() == 'http' else 'https://'
6464
# TODO : 最终拼接的是啥,还需要调查下
6565
url = current_protocol + context.endpoint + http_request.url
66-
6766
if http_request.port != 80 or http_request.port != 443:
6867
url = current_protocol + context.endpoint + ":" + \
6968
str(http_request.port) + http_request.url
@@ -76,9 +75,19 @@ def do_request(context):
7675

7776
# ignore the warning-InsecureRequestWarning
7877
urllib3.disable_warnings()
78+
# TODO fixed the retry flag
79+
context.retry_flag = False
80+
try:
81+
response = s.send(prepped, proxies=http_request.proxy,
82+
timeout=http_request.timeout,
83+
allow_redirects=False, verify=None, cert=None)
84+
except IOError as e:
85+
from aliyunsdkcore.acs_exception.exceptions import ClientException
86+
from aliyunsdkcore.acs_exception import error_code
87+
exception = ClientException(error_code.SDK_HTTP_ERROR, str(e))
7988

80-
response = s.send(prepped, proxies=http_request.proxy,
81-
timeout=http_request.timeout,
82-
allow_redirects=False, verify=None, cert=None)
83-
context.http_response = response
84-
89+
context.exception = exception
90+
from alibabacloud.request import HTTPResponse
91+
context.http_response = HTTPResponse()
92+
else:
93+
context.http_response = response

aliyun-python-sdk-core/alibabacloud/handlers/retry_handler.py

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,38 +31,32 @@ class RetryHandler(RequestHandler):
3131
# pass
3232

3333
def handle_request(self, context):
34-
print(1111111, context.http_request.retries)
3534
if context.http_request.retries == 0:
3635
retry_policy_context = RetryPolicyContext(context.api_request, None, 0, None)
3736
if context.config.retry_policy.should_retry(retry_policy_context) & \
3837
RetryCondition.SHOULD_RETRY_WITH_CLIENT_TOKEN:
3938
self._add_request_client_token(context.api_request)
4039

4140
def handle_response(self, context):
42-
print('context.exception', context.exception)
4341
api_request = context.api_request
4442
retry_policy_context = RetryPolicyContext(api_request, context.exception,
4543
context.http_request.retries,
4644
context.http_response.status_code)
4745

4846
should_retry = context.config.retry_policy.should_retry(retry_policy_context)
4947

50-
if should_retry & RetryCondition.SHOULD_RETRY:
51-
retry_policy_context.retryable = should_retry
52-
53-
time_to_sleep = context.config.retry_policy.compute_delay_before_next_retry(retry_policy_context)
54-
time.sleep(time_to_sleep / 1000.0)
55-
context.http_request.retries += 1
56-
57-
context.retry_flag = True
58-
# context.retry_backoff = context.config.retry_policy.compute_delay_before_next_retry(
59-
# retry_policy_context
60-
# )
61-
else:
48+
# if should_retry & RetryCondition.SHOULD_RETRY:
49+
if should_retry & RetryCondition.NO_RETRY:
6250
context.retry_flag = False
63-
# context.retry_backoff = 0
6451
if context.exception:
6552
raise context.exception
53+
else:
54+
retry_policy_context.retryable = should_retry
55+
context.http_request.retries += 1
56+
context.retry_flag = True
57+
context.retry_backoff = context.config.retry_policy.compute_delay_before_next_retry(
58+
retry_policy_context
59+
)
6660

6761

6862
@staticmethod

aliyun-python-sdk-core/alibabacloud/handlers/server_error_handler.py

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,35 +25,32 @@ def handle_response(self, context):
2525

2626
response = context.http_response
2727
request_id = None
28+
from alibabacloud.request import HTTPResponse
29+
if not isinstance(response, HTTPResponse):
30+
try:
31+
body_obj = json.loads(response.text.decode('utf-8'))
32+
request_id = body_obj.get('RequestId')
33+
except (ValueError, TypeError, AttributeError):
34+
# in case the response body is not a json string, return the raw
35+
# data instead
36+
# logger.warning('Failed to parse response as json format. Response:%s', response.text)
37+
pass
38+
if response.status_code < codes.OK or response.status_code >= codes.MULTIPLE_CHOICES:
2839

29-
try:
30-
body_obj = json.loads(response.text.decode('utf-8'))
31-
request_id = body_obj.get('RequestId')
32-
except (ValueError, TypeError, AttributeError):
33-
# in case the response body is not a json string, return the raw
34-
# data instead
35-
# logger.warning('Failed to parse response as json format. Response:%s', response.text)
36-
pass
37-
if response.status_code < codes.OK or response.status_code >= codes.MULTIPLE_CHOICES:
38-
39-
server_error_code, server_error_message = self._parse_error_info_from_response_body(
40-
response.text)
41-
if response.status_code == codes.BAD_REQUEST and server_error_code == 'SignatureDoesNotMatch':
42-
if http_request.signature == server_error_message.split(':')[1]:
43-
server_error_code = 'InvalidAccessKeySecret'
44-
server_error_message = 'The AccessKeySecret is incorrect. ' \
45-
'Please check your AccessKeyId and AccessKeySecret.'
46-
from aliyunsdkcore.acs_exception.exceptions import ServerException
47-
exception = ServerException(
48-
server_error_code,
49-
server_error_message,
50-
http_status=response.status_code,
51-
request_id=request_id)
52-
53-
# logger.error("ServerException occurred. Host:%s SDK-Version:%s ServerException:%s",
54-
# http_request.endpoint, aliyunsdkcore.__version__, str(exception))
55-
56-
context.exception = exception
40+
server_error_code, server_error_message = self._parse_error_info_from_response_body(
41+
response.text)
42+
if response.status_code == codes.BAD_REQUEST and server_error_code == 'SignatureDoesNotMatch':
43+
if http_request.signature == server_error_message.split(':')[1]:
44+
server_error_code = 'InvalidAccessKeySecret'
45+
server_error_message = 'The AccessKeySecret is incorrect. ' \
46+
'Please check your AccessKeyId and AccessKeySecret.'
47+
from aliyunsdkcore.acs_exception.exceptions import ServerException
48+
exception = ServerException(
49+
server_error_code,
50+
server_error_message,
51+
http_status=response.status_code,
52+
request_id=request_id)
53+
context.exception = exception
5754

5855
@staticmethod
5956
def _parse_error_info_from_response_body(response_body):

aliyun-python-sdk-core/alibabacloud/request.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,10 @@ def __init__(self, accept_format=None, method=None, protocol=None, proxy=None,
4141
self.enable_retry = enable_retry
4242
self.max_retry_times = max_retry_times
4343
self.retries = retries
44+
45+
46+
class HTTPResponse:
47+
def __init__(self, status_code=None, headers=None, content=None):
48+
self.status_code = status_code
49+
self.headers = headers
50+
self.content = content

0 commit comments

Comments
 (0)