Skip to content

Commit 0111960

Browse files
committed
SNOW-27671: raise exception if all retry for PUT and GET fail.
1 parent 20459d1 commit 0111960

File tree

1 file changed

+33
-24
lines changed

1 file changed

+33
-24
lines changed

s3_util.py

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ def upload_one_file_to_s3(meta):
204204
put_callback = meta[u'put_callback']
205205
put_callback_output_stream = meta[u'put_callback_output_stream']
206206

207-
sleeping_time = 1
207+
last_err = None
208208
retry = 5
209209
for t in range(retry):
210210
try:
@@ -231,26 +231,30 @@ def upload_one_file_to_s3(meta):
231231
logger.debug(u"AWS Token expired. Renew and retry")
232232
meta[u'result_status'] = RESULT_STATUS_RENEW_TOKEN
233233
return
234-
logger.debug(u"Failed to upload a file: %s", err)
234+
logger.exception(
235+
u"Failed to upload a file: %s, err: %s",
236+
data_file, err)
235237
raise err
236-
except OpenSSL.SSL.SysCallError as err:
238+
except (OpenSSL.SSL.SysCallError, S3UploadFailedError) as err:
239+
last_err = err
237240
if t == retry - 1 or err.args[0] not in (
238241
errno.ECONNRESET,
239242
errno.ETIMEDOUT,
240243
errno.EPIPE,
241244
-1):
242245
raise err
243-
logger.warn('Failed to upload a file [%s]. Retrying', err)
244-
if sleeping_time < 16:
245-
sleeping_time *= 2
246-
logger.debug(u"sleeping: %s", sleeping_time)
247-
time.sleep(sleeping_time)
248-
except S3UploadFailedError as err:
249-
logger.debug(u"Failed to upload a file [%s]. Retrying", err)
250-
if sleeping_time < 16:
251-
sleeping_time *= 2
246+
logger.info(
247+
'Failed to upload a file: %s, err: %s. Retrying',
248+
data_file, err)
249+
sleeping_time = min(2 ** t, 16)
252250
logger.debug(u"sleeping: %s", sleeping_time)
253251
time.sleep(sleeping_time)
252+
else:
253+
if last_err:
254+
raise last_err
255+
else:
256+
raise Exception(
257+
"Unknown Error in uploading a file: %s", data_file)
254258

255259
logger.debug(u'DONE putting a file')
256260
meta[u'dst_file_size'] = meta[u'upload_size']
@@ -298,7 +302,7 @@ def download_one_file_from_s3(meta):
298302
get_callback = meta[u'get_callback']
299303
get_callback_output_stream = meta[u'get_callback_output_stream']
300304

301-
sleeping_time = 1
305+
last_err = None
302306
retry = 5
303307
for t in range(retry):
304308
try:
@@ -321,26 +325,31 @@ def download_one_file_from_s3(meta):
321325
logger.debug(u"AWS Token expired. Renew and retry")
322326
meta[u'result_status'] = RESULT_STATUS_RENEW_TOKEN
323327
return
324-
logger.debug(u"Failed to download a file: %s", e)
328+
logger.exception(
329+
u"Failed to download a file: %s, err: %s",
330+
full_dst_file_name, err)
325331
raise err
326-
except OpenSSL.SSL.SysCallError as err:
332+
except (OpenSSL.SSL.SysCallError, RetriesExceededError) as err:
333+
last_err = err
327334
if t == retry - 1 or err.args[0] not in (
328335
errno.ECONNRESET,
329336
errno.ETIMEDOUT,
330337
errno.EPIPE,
331338
-1):
332339
raise err
333-
logger.warn('Failed to download a file [%s]. Retrying', err)
334-
if sleeping_time < 16:
335-
sleeping_time *= 2
336-
logger.debug(u"sleeping: %s", sleeping_time)
337-
time.sleep(sleeping_time)
338-
except RetriesExceededError as err:
339-
logger.debug(u"Failed to download a file [%s]. Retrying", err)
340-
if sleeping_time < 16:
341-
sleeping_time *= 2
340+
logger.info(
341+
'Failed to download a file: %s, err: %s. Retrying',
342+
full_dst_file_name, err)
343+
sleeping_time = min(2 ** t, 16)
342344
logger.debug(u"sleeping: %s", sleeping_time)
343345
time.sleep(sleeping_time)
346+
else:
347+
if last_err:
348+
raise last_err
349+
else:
350+
raise Exception(
351+
"Unknown Error in downloading a file: %s",
352+
full_dst_file_name)
344353

345354
if u'encryption_material' in meta:
346355
akey = s3client.Object(s3location.bucket_name, s3path)

0 commit comments

Comments
 (0)