Skip to content

Commit

Permalink
* S3/Exceptions.py, S3/S3.py: Some HTTP_400 exceptions
Browse files Browse the repository at this point in the history
  are retriable.



git-svn-id: https://s3tools.svn.sourceforge.net/svnroot/s3tools/s3cmd/trunk@406 830e0280-6d2a-0410-9c65-932aecc39d9d
  • Loading branch information
mludvig committed May 20, 2010
1 parent 68afbd7 commit 46631fc
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 1 deletion.
5 changes: 5 additions & 0 deletions ChangeLog
@@ -1,3 +1,8 @@
2010-05-20 Michal Ludvig <mludvig@logix.net.nz>

* S3/Exceptions.py, S3/S3.py: Some HTTP_400 exceptions
are retriable.

2010-03-19 Michal Ludvig <mludvig@logix.net.nz>

* s3cmd, S3/ACL.py: Print all ACLs for a Grantee
Expand Down
9 changes: 8 additions & 1 deletion S3/Exceptions.py
Expand Up @@ -35,7 +35,11 @@ class S3Error (S3Exception):
def __init__(self, response):
self.status = response["status"]
self.reason = response["reason"]
self.info = {}
self.info = {
"Code" : "",
"Message" : "",
"Resource" : ""
}
debug("S3Error: %s (%s)" % (self.status, self.reason))
if response.has_key("headers"):
for header in response["headers"]:
Expand All @@ -49,6 +53,9 @@ def __init__(self, response):
if child.text != "":
debug("ErrorXML: " + child.tag + ": " + repr(child.text))
self.info[child.tag] = child.text
self.code = self.info["Code"]
self.message = self.info["Message"]
self.resource = self.info["Resource"]

def __unicode__(self):
retval = u"%d " % (self.status)
Expand Down
10 changes: 10 additions & 0 deletions S3/S3.py
Expand Up @@ -580,8 +580,17 @@ def send_file(self, request, file, labels, throttle = 0, retries = _max_retries)
response['headers']['etag'] = ''

if response["status"] < 200 or response["status"] > 299:
try_retry = False
if response["status"] >= 500:
## AWS internal error - retry
try_retry = True
elif response["status"] >= 400:
err = S3Error(response)
## Retriable client error?
if err.code in [ 'BadDigest', 'OperationAborted', 'TokenRefreshRequired', 'RequestTimeout' ]:
try_retry = True

if try_retry:
if retries:
warning("Upload failed: %s (%s)" % (resource['uri'], S3Error(response)))
warning("Waiting %d sec..." % self._fail_wait(retries))
Expand All @@ -590,6 +599,7 @@ def send_file(self, request, file, labels, throttle = 0, retries = _max_retries)
else:
warning("Too many failures. Giving up on '%s'" % (file.name))
raise S3UploadError

## Non-recoverable error
raise S3Error(response)

Expand Down

0 comments on commit 46631fc

Please sign in to comment.