Azureの小ネタ (改)

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

CloudBlob.DownloadFile()がバグっている件について

こんばんは、statemacihneです。Azure Driveの件では、たくさんの方がTwitterで反応してくださってありがとうございます。Blogを更新する励みになるというものです。さて、本日もAzureの時事ネタということで以下より。

Windows Azure Storage Client Library: CloudBlob.DownloadToFile() may not entirely overwrite file contents - Windows Azure Storage Team Blog - Site Home - MSDN Blogs

CloudBlob.DownloadFile() がバグっていて、既存ファイルに上書きした場合、以前のファイル内容が残ってしまうというものです。

再現コード

自己完結する再現コードは以下の通り(LINQPad向け) 。

  • 内容が10文字のBlobをz.txtにダウンロード
  • 次に内容が5文字のBlobを既存のz.txtに上書きダウンロード
  • 結果をみると、既存ファイルの内容が残る。
  • 最後に回避策。
void Main()
{
    var account = CloudStorageAccount.DevelopmentStorageAccount;
    var client = account.CreateCloudBlobClient();
    client.GetContainerReference("test").CreateIfNotExist();
    
    var a = client.GetBlobReference("test/a.text");
    var b = client.GetBlobReference("test/b.text");
    
    a.UploadText("1234567890");
    b.UploadText("ABCEF");
    var output = @"c:\temp\z.txt";
    File.Delete(output);
    
    // a -> "z.txt" 
    a.DownloadToFile(output);
    Console.WriteLine("z.txt : " + File.ReadAllText(output));

    // b -> "z.txt"
    b.DownloadToFile(output);
    Console.WriteLine("z.txt : " + File.ReadAllText(output));
    
    // 回避法
    using (var stream = File.Create(output))
    { 
        b.DownloadToStream(stream); 
    }
    Console.WriteLine("z.txt : " + File.ReadAllText(output));
}

実行結果

2行目がバグった結果です。3行目は回避策により正しくダウンロードされた結果。

z.txt : 1234567890
z.txt : ABCEF67890
z.txt : ABCEF

まとめ

開発ストレージでも、Azureでも再現します。Storageライブラリのバグなんで、両環境で再現するのでしょう。また、Storageライブラリがバグったときは、再パッケージが必須っぽいんで、ちと面倒というか。