2015-02-10 35 views
2

早期版本的Azure SDK有CloudBlob.CopyFromBlob(),它是同步的,我們在我們的代碼中使用。我們現在需要轉移到SDK 2.4,並且沒有這種方法,而是有CloudBlockBlob.StartCopyFromBlob(),它返回一些魔法令牌,我們可以使用它來檢查副本是如何完成的。如何在只有StartCopyFromBlob()的Azure SDK中實現同步複製單個blob?

在我們的代碼中「背景」複製blob沒有意義 - 同步執行復制將會很好,所以很高興以某種方式實現舊版CopyFromBlob()的新版SDK。

這裏是我的方法:

CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(sourcePath); 
CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(targetPath); 
var copyToken = targetBlob.StartCopyFromBlob(sourceBlob.Uri); 
while(true) { 
    System.Threading.Thread.Sleep(100); 
    CloudBlockBlob target = targetContainer.GetBlockBlobReference(targetPath); 
    bool greatSuccess = false; 
    switch(target.CopyState.Status) { 
     case CopyStatus.Success: 
      greatSuccess = true; 
      break; 
     case CopyStatus.Pending: 
      continue; 
     default: 
      throw new Exception("Failed to copy"); 
    } 
    if(success) { 
     break; 
    } 
} 

它看起來的工作,但我不知道有沒有是潛在的問題在那裏。

什麼是使用StartCopyFromBlob(),然後等待複製完成的慣用方式?

+0

這樣做的一個問題是,它向您的服務器發送垃圾郵件請求的速度與您的服務器的速度一樣快...... – usr 2015-02-10 09:04:36

+0

@usr:Ouch,我忘記了原型代碼中的延遲。這確實非常重要,因爲交易成本可能成爲該法案的主要部分。 – sharptooth 2015-02-10 09:08:40

+0

@sharptooth,你是在同一個存儲帳戶或跨存儲帳戶複製blob嗎? – 2015-02-10 22:50:04

回答

11

如果複製操作針對相同的存儲帳戶和相同類型(例如 - > blob以阻止同一存儲帳戶中的blob副本),則副本是同步的,並且您可以預期複製操作已完成時StartCopyFromBlob ()返回。您還可以通過檢查targetBlob.CopySate值來驗證它是否成功。

CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(sourcePath); 
CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(targetPath); 
var copyToken = targetBlob.StartCopyFromBlob(sourceBlob.Uri); 
if(targetBlob.CopyState.Status == CopyStatus.Success) 
{ 
    // Copy completed successfully 
} 

對於所有其他情況(跨存儲賬戶或甚至跨越同一存儲帳戶內型)複製操作是異步的並且在執行背景備用使用資源。目前,服務無法提供SLA複製的速度。如果你想在這些情況下保持一致的行爲,最好的選擇是讓客戶做它自己的副本 - 從源下載數據並上傳到目的地。

+0

我想我需要以某種方式檢索它之前檢索'CopyState'。 – sharptooth 2015-02-12 10:19:19

+0

StartCopyFromBlob api調用應該刷新您的CopyState狀態。 – 2015-02-12 17:58:39

+0

@ VinayShah-Microsoft如果我將CloudPageBlob複製到同一個存儲帳戶中的CloudBlockBlob,那麼在StartCopyFromBlob()返回時會完成嗎?當你說'StartCopyFromBlob()'刷新複製狀態時,這是否意味着如果我有一個循環運行,看着狀態完成, 'while(targetBlob.CopyState.Status == CopyStatus.Pending){Task.Delay(100); }如果最終會解決? – GFoley83 2015-12-10 08:46:44

相關問題