Browse code

* S3/S3.py: Some errors during file upload were incorrectly interpreted as MD5 mismatch. (bug #2384990)

git-svn-id: https://s3tools.svn.sourceforge.net/svnroot/s3tools/s3cmd/trunk@333 830e0280-6d2a-0410-9c65-932aecc39d9d

Michal Ludvig authored on 2009/01/07 21:39:39
Showing 2 changed files
... ...
@@ -1,3 +1,8 @@
1
+2009-01-08  Michal Ludvig  <michal@logix.cz>
2
+
3
+	* S3/S3.py: Some errors during file upload were incorrectly 
4
+	  interpreted as MD5 mismatch. (bug #2384990)
5
+
1 6
 2009-01-07  Michal Ludvig  <michal@logix.cz>
2 7
 
3 8
 	* s3cmd: New command 'setacl'.
... ...
@@ -430,7 +430,7 @@ class S3(object):
430 430
 		md5_hash = md5()
431 431
 		try:
432 432
 			while (size_left > 0):
433
-				debug("SendFile: Reading up to %d bytes from '%s'" % (self.config.send_chunk, file.name))
433
+				#debug("SendFile: Reading up to %d bytes from '%s'" % (self.config.send_chunk, file.name))
434 434
 				data = file.read(self.config.send_chunk)
435 435
 				md5_hash.update(data)
436 436
 				conn.send(data)
... ...
@@ -448,6 +448,7 @@ class S3(object):
448 448
 			response["data"] = http_response.read()
449 449
 			response["size"] = size_total
450 450
 			conn.close()
451
+			debug(u"Response: %s" % response)
451 452
 		except Exception, e:
452 453
 			if self.config.progress_meter:
453 454
 				progress.done("failed")
... ...
@@ -487,6 +488,20 @@ class S3(object):
487 487
 		if not response['headers'].has_key('etag'):
488 488
 			response['headers']['etag'] = '' 
489 489
 
490
+		if response["status"] < 200 or response["status"] > 299:
491
+			if response["status"] >= 500:
492
+				## AWS internal error - retry
493
+				if retries:
494
+					warning("Upload failed: %s (%s)" % (resource['uri'], S3Error(response)))
495
+					warning("Waiting %d sec..." % self._fail_wait(retries))
496
+					time.sleep(self._fail_wait(retries))
497
+					return self.send_file(request, file, labels, throttle, retries - 1)
498
+				else:
499
+					warning("Too many failures. Giving up on '%s'" % (file.name))
500
+					raise S3UploadError
501
+			## Non-recoverable error
502
+			raise S3Error(response)
503
+
490 504
 		debug("MD5 sums: computed=%s, received=%s" % (md5_computed, response["headers"]["etag"]))
491 505
 		if response["headers"]["etag"].strip('"\'') != md5_hash.hexdigest():
492 506
 			warning("MD5 Sums don't match!")
... ...
@@ -497,8 +512,6 @@ class S3(object):
497 497
 				warning("Too many failures. Giving up on '%s'" % (file.name))
498 498
 				raise S3UploadError
499 499
 
500
-		if response["status"] < 200 or response["status"] > 299:
501
-			raise S3Error(response)
502 500
 		return response
503 501
 
504 502
 	def recv_file(self, request, stream, labels, start_position = 0, retries = _max_retries):