我正在尝试将blob从源位置复制到租约下的目标位置。我正在使用AutoRenewLease的修改版本来执行此操作。 以下是我的代码中的步骤
实际结果: 远程服务器返回错误:(412)租约ID匹配,但指定的租约必须是无限期租约。
有没有办法解决此问题并复制blob而没有无限租约。
答案 0 :(得分:1)
根据文档here
,无法启动目标blob具有有限租约的复制blob操作。
因此,如果您想使用租赁选项,则必须在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,所以这种方法对我有用。如果我超时等待元数据显示,我第二次请求失败,因此用户可以重试。我这样做是假设最好快速失败并让用户重试而不是无限期地等待。