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に関して存在していても存在しないゾンビ状態の一種であると思います!
理想的には私はブロブの状態に関する次の情報を持っているしたいと思います:
- は、コミットされていないブロック
どれが含まれ、
私は2つのステートレスAzureの機能を使用しています:ブロックをアップロードし、それがブロックをコミットし公開します。私は、コミットされていないブロックを持つBLOBが存在するかどうかを確認するPublish関数をチェックします。私はガベージコレクタを認識しています。 Publish関数が呼び出されず、Azureがコミットされていないブロックを収集するようにした場合、このメカニズムを使用する予定です。 – AntoineC