Azure python SDK - AzureHttpError: The condition specified using HTTP conditional header(s) is not met

Azure python SDK - AzureHttpError: The condition specified using HTTP conditional header(s) is not met

我正在尝试使用以下代码从 Azure Blob 存储下载一个大型 VHD 文件 (30GB):

blob_service.get_blob_to_path('vhds', '20161206092429.vhd', '20161206092429.vhd')

其中第一个参数是容器名称,第二个是 blob 名称,第三个是本地 file/path 它将被保存的地方。这个 30GB 的下载工作正常,但突然间我开始收到这个错误:

AzureHttpError: The condition specified using HTTP conditional header(s) is not met. ConditionNotMetThe condition specified using HTTP conditional header(s) is not met. RequestId:88b6ac24-0001-0001-5ec0-4f490d000000 Time:2016-12-06T12:57:13.5389237Z

下载现在可以正常运行一段时间:有时时间很短,有时时间很长。甚至高达 9 或 10GB 的完整 30GB 下载。

根据这个问题:

这似乎是一个竞争条件,但如果不深入研究和处理 SDK 代码,这对解决问题没有多大帮助。关于可能导致此问题的原因的任何建议,因为下载以前是有效的?可能是 Azure 云中断了?

随着VHD的变化,其相关的ETag也会发生变化。一旦发生这种情况,文件复制操作将不再有效。我相信这就是您通过调用 blob_service.get_blob_to_path() 看到的内容,因为您的 vhd 正在与 运行 VM 一起使用。并且...即使虚拟机处于 idle - 运行 OS 永远不会真正空闲 - 总会有一些后台操作,可能会写入磁盘。

并不是说它能确保文件复制操作成功,但您需要先关闭 VM,然后再启动复制。

或者,您可以制作 VHD 的快照,然后通过快照而不是原始 vhd 进行复制(这样您就可以在复制操作期间继续使用您的 vhd)。

如果您使用 sas_token 创建 blob 服务,它可能只被设置为持续一个小时。如果是这种情况,您可以将创建令牌的到期时间更改为稍后的时间点。