none
Windows Azure 実環境上で CloudDrive の Mount メソッドが Unknown Error を発生させる

    質問

  • CloudDrive を利用するサンプルを作成し、Windows Azure にデプロイして動かすと、CloudDrive の Mount メソッド内で「 Unknown Error HRESULT=D000000D 」という内容の例外が発生してしまいます。

    問題のコードは次のとおりです。Development Storage では問題なく動作しました。

    // 構成ファイルから接続文字列を取得しアカウント作成
    CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("MyStorage");
    
    // Blob クライアント作成
    CloudBlobClient blobClient = account.CreateCloudBlobClient();
    
    // Blob コンテナがなければ作成
    CloudBlobContainer container = blobClient.GetContainerReference("drives");
    container.CreateIfNotExist();
    
    // Drive 用の PageBlob を作成
    // サイズは 50 MB
    CloudPageBlob pageBlob = container.GetPageBlobReference("mydrive");
    pageBlob.Create(50 * 1024 * 1024);
    
    // キャッシュの初期化
    // MaximumSizeInMegabytes の値は 50 MB
    LocalResource localCache = RoleEnvironment.GetLocalResource("MyCache");
    CloudDrive.InitializeCache(localCache.RootPath + "cache", localCache.MaximumSizeInMegabytes);
    
    // Drive を作成
    // すでに存在すれば例外が発生するが今回は握りつぶす
    CloudDrive drive = new CloudDrive(pageBlob.Uri, account.Credentials);
    try
    {
      // Drive の容量は 50 MB
      drive.Create(50);
    }
    catch (CloudDriveException ex)
    {
      // 例外が発生したら内容をTextBoxに出力
      _textBox.Text = ex.Message + Environment.NewLine + ex.StackTrace;
    }
    
    // Drive をマウント
    // ※ここで Unknown Error が発生する
    string letter = drive.Mount(10, DriveMountOptions.None);
    
    

    CloudStorageAccount 作成時に利用している接続文字列は、Windows Azure に追加した Storage サービスのアカウント名とキーをもとに作成したものです。Visual Studio のロールのプロパティにある、[設定]のページから追加しました。

    また、サンプルを作成した環境は次のとおりです。

    • Windows 7
    • Visual Studio 2010
    • .NET Framework 4
    • Windows Azure Tools for Microsoft Visual Studio 2010 1.2

    ここ数日ネットで調べてみましたが、有力な情報を見つけることができませんでした。

    どうかアドバイスをお願いします。


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年10月6日 1:13

回答

  • Driveを作成するのに、あらかじめPageBlobを作成しておく必要はなかったと思います。

    しががってコンテナだけ作成しておいて、PageBlobを作らない状態で、
    以下のようにすれば動くと思います。CreateでPageBlobの作成とNTFSフォーマット的
    なことをしているはずです。

    例外が出るのは、ゼロページで書き込まれたPageBlobをマウントしようとしたからではないかと推測します。
    また、開発ファブリックにおけるドライブはsubstコマンドで実現されている(とホワイトペパーに書いてあったきがする)ので、
    Blob/Table以上に本番環境との差が激しいです。

    CloudDrive drive = account.CloudDrive("drives/mydrive");
    try
    {
      drive.Create(50);
    }
    catch (CloudDriveException ex)
    {
    }

    string letter = drive.Mount(10, DriveMountOptions.None);

    ちなみに固定長、NTFSでフォーマットとしたVHDをPageBlobとしてUploadすればマウントできると思います。

    --
    statemachine : http://d.hatena.ne.jp/StateMachine/

    • 回答としてマーク なかむら 2010年10月12日 8:30
    2010年10月6日 10:27

すべての返信

  • Driveを作成するのに、あらかじめPageBlobを作成しておく必要はなかったと思います。

    しががってコンテナだけ作成しておいて、PageBlobを作らない状態で、
    以下のようにすれば動くと思います。CreateでPageBlobの作成とNTFSフォーマット的
    なことをしているはずです。

    例外が出るのは、ゼロページで書き込まれたPageBlobをマウントしようとしたからではないかと推測します。
    また、開発ファブリックにおけるドライブはsubstコマンドで実現されている(とホワイトペパーに書いてあったきがする)ので、
    Blob/Table以上に本番環境との差が激しいです。

    CloudDrive drive = account.CloudDrive("drives/mydrive");
    try
    {
      drive.Create(50);
    }
    catch (CloudDriveException ex)
    {
    }

    string letter = drive.Mount(10, DriveMountOptions.None);

    ちなみに固定長、NTFSでフォーマットとしたVHDをPageBlobとしてUploadすればマウントできると思います。

    --
    statemachine : http://d.hatena.ne.jp/StateMachine/

    • 回答としてマーク なかむら 2010年10月12日 8:30
    2010年10月6日 10:27
  • statemachineさん、返信ありがとうございます。

    ホワイトペーパーを見たところ、確かに「コンテナは必要」「PageBlobは存在してはいけない」と書かれていますね・・・。

    コンテナだけ作成しておいて、PageBlob を作成せずに、CloudDriveのCreateを実行することで、Mountに成功するようになりました。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年10月12日 8:30