33from __future__ import absolute_import
44
55import datetime
6+ import logging
67from multiprocessing .pool import ThreadPool
8+ from time import sleep
79
810# python 2 and python 3 compatibility library
911import six
1618from volcenginesdkcore .interceptor import InterceptorChain , InterceptorContext
1719from volcenginesdkcore .interceptor import Request , Response
1820
21+ logger = logging .getLogger (__name__ )
22+
1923
2024class ApiClient (object ):
2125 """Generic API client for Swagger client library builds.
@@ -63,7 +67,7 @@ def __init__(self, configuration=None, header_name=None, header_value=None,
6367 self .default_headers [header_name ] = header_value
6468 self .cookie = cookie
6569 # Set default User-Agent.
66- self .user_agent = 'volcstack-python-sdk/3 .0.15 '
70+ self .user_agent = 'volcstack-python-sdk/4 .0.1 '
6771 self .client_side_validation = configuration .client_side_validation
6872
6973 self .interceptor_chain = InterceptorChain ()
@@ -122,14 +126,35 @@ def __call_api(
122126
123127 interceptor_context = self .interceptor_chain .execute_request (interceptor_context )
124128
125- # perform request and return response
126- response_data = self .request (
127- method , url = interceptor_context .request .url , query_params = interceptor_context .request .query_params ,
128- headers = interceptor_context .request .header_params ,
129- post_params = interceptor_context .request .post_params , body = interceptor_context .request .body ,
130- _preload_content = interceptor_context .request .preload_content ,
131- _request_timeout = interceptor_context .request .request_timeout )
132- self .last_response = response_data
129+ retry_count = 0
130+ response_data = None
131+ retry_err = None
132+
133+ auto_retry = interceptor_context .request .auto_retry
134+ retryer = interceptor_context .request .retryer
135+ num_max_retries = retryer .num_max_retries
136+
137+ while True :
138+ # perform request and return response
139+ try :
140+ response_data = self .request (
141+ method , url = interceptor_context .request .url , query_params = interceptor_context .request .query_params ,
142+ headers = interceptor_context .request .header_params ,
143+ post_params = interceptor_context .request .post_params , body = interceptor_context .request .body ,
144+ _preload_content = interceptor_context .request .preload_content ,
145+ _request_timeout = interceptor_context .request .request_timeout )
146+ self .last_response = response_data
147+ except Exception as e :
148+ logger .warning ("request error: {}" .format (e ))
149+ retry_err = e
150+ if retry_count >= num_max_retries :
151+ raise e
152+
153+ if not auto_retry or not self .request_retry (response_data , retry_count , retry_err , retryer ):
154+ if retry_err is not None :
155+ raise retry_err
156+ break
157+ retry_count += 1
133158
134159 interceptor_context .response = Response (response_data )
135160 interceptor_context = self .interceptor_chain .execute_response (interceptor_context )
@@ -141,6 +166,18 @@ def __call_api(
141166 return (response .result , response .http_response .status ,
142167 response .http_response .getheaders ())
143168
169+ def request_retry (self , response_data , retry_count , retry_err , retryer ):
170+ if retryer .should_retry (response_data , retry_count , retry_err ):
171+ delay = retryer .get_backoff_delay (retry_count )
172+ sleep (delay / 1000 )
173+ if self .configuration .debug :
174+ logger .debug (
175+ "retry backoff strategy:%s, retry condition: %s, max retry count:%d, current retry count: %d, retry delay(ms):%f" ,
176+ type (retryer .backoff_strategy ).__name__ , type (retryer .retry_condition ).__name__ ,
177+ retryer .num_max_retries , retry_count + 1 , delay )
178+ return True
179+ return False
180+
144181 def call_api (self , resource_path , method ,
145182 path_params = None , query_params = None , header_params = None ,
146183 body = None , post_params = None , files = None ,
0 commit comments