0

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

  1. 如果 blob 不存在,则创建一个空的目标 blob
  2. 使用leaseId 在 blob 上获取定期 30 秒的租约(我自动续订)
  3. 使用leaseId 创建一个AccessCondition 对象
  4. 将 AccessCondition 对象作为 destAccessCondition 传递给 StartCopyFromBlobAsync

实际结果:远程服务器返回错误:(412) 租约 ID 匹配,但指定租约必须是无限期租约。

有没有办法解决这个问题并复制一个没有无限租约的 blob。

4

2 回答 2

1

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

在此处输入图像描述

因此,如果您想使用租约选项,则必须是对 blob 的无限租约。

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

然后,您不断检查目标 blob 的复制状态。完全复制 blob 后,您可以简单地中断 blob 上的租约。现在有一种可能性(正如您所提到的)您的复制虚拟机可能会出现故障。在这种情况下,一旦复制 VM 重新联机,您就会再次开始检查复制状态。此外,分配给复制操作的最长时间为 2 周。如果在 2 周内没有复制 blob,您可以简单地中断该 blob 的租约。请注意,在打破 blob 的租约时,您不需要最少的 id。

于 2015-11-25T18:49:05.857 回答
0

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

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

于 2015-11-26T02:02:04.050 回答