2017-11-18 9 views
0

BlockBlobがまったく存在しないか、コミットされていないブロックが含まれているかどうかを判断できません。 falseを返すCloudBlockBlob.Exists()両方のケースでコミットされていないブロックを持つAzure BlockBlobが存在するかどうかを判断するにはどうしたらいいですか?

private CloudBlobContainer _BlobContainer; 

private async Task BlobExistTest() 
{ 
    // Get a reference to a non-existing blob: 
    CloudBlockBlob blob1 = _BlobContainer.GetBlockBlobReference("Blob1.txt"); 

    // Add a block: 
    MemoryStream blockData = new MemoryStream(Encoding.UTF8.GetBytes("Block data.")); 
    string blockId = Convert.ToBase64String(BitConverter.GetBytes(0)); 
    await blob1.PutBlockAsync(blockId, blockData, null); 

    // Exists? 
    bool blob1Exists = await blob1.ExistsAsync(); 
    var blob1BlockCount = (await blob1.DownloadBlockListAsync(BlockListingFilter.All, null, null, null)).Count(); 

    // Results: 
    // - blob1Exits: false 
    // - blob1BlockCount: 1 


    // Get a reference to a second non-existing blob: 
    CloudBlockBlob blob2 = _BlobContainer.GetBlockBlobReference("Blob2.txt"); 

    // Exists? 
    bool blob2Exists = await blob2.ExistsAsync(); 
    var blob2BlockCount = (await blob2.DownloadBlockListAsync(BlockListingFilter.All, null, null, null)).Count(); 

    // Results: 
    // - blob2Exits: false 
    // - Exception on blob2.DownloadBlockListAsync(): The remote server returned an error: (404) Not Found. 
} 

次のコードを調べてください。 DownloadBlockList()は、「存在しない」Blobが実際に存在し、コミットされていないブロックを持つことを判別するために使用できます。私はこのソリューションが非効率で、例外に依存しているので、このソリューションが気に入らない。

私は、コミットされていないブロックで作られたBLOBがAzure Storage APIに関して存在していても存在しないゾンビ状態の一種であると思います!

理想的には私はブロブの状態に関する次の情報を持っているしたいと思います:

  • は、コミットされていないブロック

どれが含まれ、

  • はすべて
  • に存在しない存在しない存在アイデアを達成する方法?

  • 答えて

    0

    特にコミットされていないブロックを持つAzure BlockBlobが存在するかどうかを確認する必要がある理由は何ですか?

    Put Block Listが呼び出された後、ブロックリストで指定されたすべてのコミットされていないブロックは、新しいblobの一部としてコミットされます。ブロブのブロックリストで指定されていないコミットされていないブロックはすべてガベージコレクトとなり、Blobサービスから削除されます。最終的に成功したPut Block操作の次の週に同じブロブ上にPut BlockまたはPut Block Listへの正常な呼び出しがない場合は、コミットされていないブロックもガベージコレクションになります。 BLOBにPut BLOBが呼び出された場合、コミットされていないブロックはすべてガベージコレクトになります。

    https://docs.microsoft.com/en-us/rest/api/storageservices/put-block

    +0

    私は2つのステートレスAzureの機能を使用しています:ブロックをアップロードし、それがブロックをコミットし公開します。私は、コミットされていないブロックを持つBLOBが存在するかどうかを確認するPublish関数をチェックします。私はガベージコレクタを認識しています。 Publish関数が呼び出されず、Azureがコミットされていないブロックを収集するようにした場合、このメカニズムを使用する予定です。 – AntoineC

    関連する問題