我尝试使用以下代码从Azure Blob Storage下载大型VHD文件(30GB):
blob_service.get_blob_to_path('vhds', '20161206092429.vhd', '20161206092429.vhd')
其中第一个参数是容器名称,第二个参数是blob名称,第三个参数是保存它的本地文件/路径。这个30GB的下载工作正常,但突然间我开始收到这个错误:
AzureHttpError:使用HTTP条件指定的条件 标头不符合。
ConditionNotMet
的 不符合使用HTTP条件标头指定的条件。 请求ID:88b6ac24-0001-0001-5ec0-4f490d000000 时间:2016-12-06T12:57:13.5389237Z
立即下载可以随机运行一段时间:有时真的很短,有时很长。甚至高达9或10GB的完整30GB下载。
根据这个问题:
Azure Blob: "The condition specified using HTTP conditional header(s) is not met"
304: The condition specified using HTTP conditional header(s) is not met
这似乎是一种竞争条件,但如果不深入研究和处理SDK代码,这对解决问题并没有多大帮助。有什么可能导致这种情况的建议,因为下载工作以前?也许是Azure云的中断?
答案 0 :(得分:2)
随着VHD的变化,其相关的ETag将发生变化。一旦发生这种情况,文件复制操作将不再有效。我相信这是您通过拨打blob_service.get_blob_to_path()
时所看到的内容,因为您的vhd正在与正在运行的VM一起使用。并且......即使虚拟机空闲 - 正在运行的操作系统永远不会空闲 - 总会有一些后台操作,可能会写入磁盘。
并不是说它能确保成功的文件复制操作,但您需要在启动副本之前先关闭VM。
或者,您可以制作VHD的快照,然后通过快照而不是原始vhd进行复制(这样可以让您在复制操作期间继续使用vhd。)
答案 1 :(得分:0)
如果您使用sas_token创建blob服务,它可能只设置为持续一个小时。如果是这种情况,您可以将创建时令牌的到期时间更改为以后的时间点。