5

我有一种情况,我将大量 blob 从一个存储容器复制到另一个存储容器,并且其中一些 blob 已复制,但在我启动复制后两天后,其中许多仍处于待处理状态。我根据以下事实做出此决定:如果我尝试对目标 blob 执行任何操作,则会收到以下错误:

Microsoft.WindowsAzure.StorageClient.StorageClientException:当前有一个挂起的复制操作。----> System.Net.WebException:远程服务器返回错误:(409)冲突。

对此我能做些什么吗?例如,我可以在事后中止副本吗?

这是我用来执行复制的复制代码。

try
{
    destinationBlob.StartCopyFromBlob(
       new Uri(sourceBlob.Uri.AbsoluteUri + signature));
    System.Diagnostics.Trace.TraceInformation(
       "Copying: {0}", destinationEndpoint.EndpointState.BlobName);
}
catch (Exception ex)
{
    var we = ex.InnerException as WebException;
    if (we != null && we.Status == WebExceptionStatus.ProtocolError)
    {
    System.Diagnostics.Trace.TraceError(
           "conflict with blob copy for blob {0}", sourceBlob.Uri.AbsoluteUri);
        return 0;
    }
}
4

1 回答 1

8

您已经知道Copy Blob 操作现在是异步的。因此,当您StartCopyFromBlob对 Blob 调用操作时,Blob 存储服务会将复制操作放入队列中。由于它是异步操作,因此您不知道何时处理它。据我了解,最长时间是 2 周7天即复制操作最多需要 2 周时间7天如果没有在 2 周内完成7天,它将被服务取消。

现在来回答你的问题:

我能做些什么吗?

我不这么认为。您无法更改队列优先级。

例如,我可以在事后中止副本吗?

是的你可以。当您调用 时StartCopyFromBlob,您会返回一个标识复制操作的字符串(称为复制 ID)。您可以使用此副本 ID 并AbortCopy在该 blob 上调用操作。您也可以在事后通过使用FetchAttributes方法获取 blob 属性来获取此副本 ID。您要检查的属性是CopyState.

于 2013-05-23T03:34:34.943 回答