読者です 読者をやめる 読者になる 読者になる

Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

開発ストレージの制限など

Windows Azure SDKに付属する開発ファブリック(Development Fabric)
には微妙な制限があって、分かってはいてもはまったりします。

有名どころでは、

  • TableのEntityに日本語を入れられない (結構致命的)
  • Blobの最大容量が2GB (あまいり問題ないかな)

などです。

今回はまったのは、64MB以上のBlobをUpload使用とすると、
StorageClientException BlobAlreadyExists な例外が発生する現象です。


結局のところ、MSDNのDifferences Between Development Storage
and Windows Azure Storage Services
http://msdn.microsoft.com/en-us/library/dd320275.aspx

には書いてあったりします。


If two requests attempt to upload a block to a blob that does not
yet exist in development storage, one request will create the blob,
and the other may return status code 409 (Conflict), with storage
services error code BlobAlreadyExists. This is a known issue.

64MB以上のBlobのUploadは、内部的に4MB単位のPutBlockに分解されて
Uploadされますが、このときPCがDual Coreマシンだったりすると、
Parallel Uploadになって、どうもコレが原因で、コンフリクトする
らしいです。

解決方法としては、BlobClient.ParallelOperationThreadCountに1を
入れておけば大丈夫みたいです。

以下コード

void Main()
{
    var account = CloudStorageAccount.DevelopmentStorageAccount;
    var bc = account.CreateCloudBlobClient();

    // ★ この行 ★
    bc.ParallelOperationThreadCount = 1;
    var blob = bc.GetBlockBlobReference("hoge/a.wmv");
    

    var video = Environment.GetFolderPath(Environment.SpecialFolder.MyVideos);
    var wmv = Path.Combine(video, @"T1-311.wmv");
    blob.UploadFile(wmv);
    Console.WriteLine ("Done");
}

7/20追加 64MBではなく32MBかもしれない。