Amazon S3cmd 在某些大文件上传时崩溃

2 投票
1 回答
898 浏览
提问于 2025-04-16 03:17

我经常把很大的bzipped sql文件上传到S3(亚马逊的云存储服务),最近发现上传的时候总是崩溃,出现了这个错误。可能是什么原因呢?总是那些特定的文件崩溃,但我能顺利上传更大的文件,所以看起来并不是因为文件大小限制的问题。

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    An unexpected error has occurred.
  Please report the following lines to:
  s3tools-general@lists.sourceforge.net
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Traceback (most recent call last):
  File "/usr/bin/s3cmd", line 1040, in <module>
    main()
  File "/usr/bin/s3cmd", line 1020, in main
    cmd_func(args)
  File "/usr/bin/s3cmd", line 188, in cmd_object_put
    response = s3.object_put_uri(real_filename, uri_final, extra_headers)
  File "/usr/lib/python2.5/site-packages/S3/S3.py", line 195, in object_put_uri
    return self.object_put(filename, uri.bucket(), uri.object(), extra_headers)
  File "/usr/lib/python2.5/site-packages/S3/S3.py", line 175, in object_put
    response = self.send_file(request, file)
  File "/usr/lib/python2.5/site-packages/S3/S3.py", line 384, in send_file
    debug("MD5 sums: computed=%s, received=%s" % (md5_computed, response["headers"]["etag"]))
KeyError: 'etag'

1 个回答

1

S3在回应中没有返回ETag(实体标签)。不管是什么原因导致ETag缺失,你现在使用的s3cmd版本没有预料到ETag会缺失,因此停止了操作。

根据我的了解,在最新版本0.9.9.91的s3cmd中,这个问题应该不再存在:

## S3.py ##
...
# S3 from time to time doesn't send ETag back in a response :-(
# Force re-upload here.
if not response['headers'].has_key('etag'):
    response['headers']['etag'] = ''
...
debug("MD5 sums: computed=%s, received=%s" % (md5_computed, response["headers"]["etag"]))
...

确保你使用的是版本0.9.9.91的s3cmd

版本0.9.9.91的s3cmd会重新尝试上传。如果后续的尝试仍然失败,可以修改S3.py,让它打印出完整的S3响应,或者使用数据包嗅探工具(在Linux上用tcpdump,在Windows上用Wireshark)来捕获同样的完整S3响应。这可能会提供一些额外的信息,帮助你了解造成这种情况的原因。

撰写回答