如果租约是无限的,StartCopyFromBlobAsync不支持目标AccessCondition

时间:2015-11-25 17:43:03

标签: azure azure-storage azure-storage-blobs blobs

我正在尝试将blob从源位置复制到租约下的目标位置。我正在使用AutoRenewLease的修改版本来执行此操作。     以下是我的代码中的步骤

  1. 如果blob不存在,则创建一个空的目标blob
  2. 使用leaseId
  3. 获取blob上的常规30秒租约(我自动重新发送)
  4. 使用leaseId创建AccessCondition对象
  5. 将AccessCondition对象作为destAccessCondition传递给StartCopyFromBlobAsync
  6. 实际结果: 远程服务器返回错误:(412)租约ID匹配,但指定的租约必须是无限期租约。

    有没有办法解决此问题并复制blob而没有无限租约。

2 个答案:

答案 0 :(得分:1)

根据文档here,无法启动目标blob具有有限租约的复制blob操作。

enter image description here

因此,如果您想使用租赁选项,则必须在blob上进行无限租约。

这是我能想到的一种方法:因为您已经租赁blob并不断更新租约,我的假设是您将某个租约ID存储在某处(您的复制VM可以也可能在30秒内崩溃)。所以你可以做的就是获得无限的租约,在一些永久存储中保存blob上的租约id。

然后,您不断检查目标blob的复制状态。完全复制blob后,您可以简单地破坏Blob上的租约。现在有可能(如你所提到的)你的副本虚拟机可能会崩溃。在这种情况下,一旦复制VM重新联机,您就会再次开始检查复制状态。此外,复制操作的最长时间为2周。如果在2周内未复制blob,则可以简单地破坏该blob上的租约。请注意,在破坏blob租约时,您不需要最少的id。

答案 1 :(得分:0)

感谢您的解决方案Gaurav。任何人都可以打破租约是非常奇怪的。这是我决定采用的解决方案。

我没有在blob上使用租约,而是检查状态409(HttpStatusCode.Conflict)。如果2个并发线程写入同一个blob,则其中一个将获得409冲突。我已经等待了第二个并发线程,它在一段时间内获得了409(因为我知道要复制的blob的大小)并检查blob上的元数据(progress =" done&#34 )。执行复制的早期线程将在完成复制后设置此元数据。我正在复制非常小的blob,所以这种方法对我有用。如果我超时等待元数据显示,我第二次请求失败,因此用户可以重试。我这样做是假设最好快速失败并让用户重试而不是无限期地等待。