有没有一种方法可以确定是否存在未提交块的Azure BlockBlob?

4

我无法确定一个BlockBlob是否完全不存在,还是包含未提交的块。

请查看以下代码:

private CloudBlobContainer _blobContainer;

private async Task BlobExistTest()
{
    // Get a reference to a brand new (non-existing) blob:
    CloudBlockBlob blob = _blobContainer.GetBlockBlobReference("Test.txt");

    // Query Azure about blob
    bool blobExists = await blob.ExistsAsync();
    try{ var blobBlockCount =  (await blob.DownloadBlockListAsync(BlockListingFilter.All, null, null, null)).Count();        }catch(Exception e){;}
    // Results: Says blob doesn't exist at all on Azure (expected)
    //   - blobExists: false
    //   - Exception on blob.DownloadBlockListAsync(): The remote server 

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

    // Query Azure - Now what does Azure say?
    blobExists = await blob.ExistsAsync();
    blobBlockCount =  (await blob.DownloadBlockListAsync(BlockListingFilter.All, null, null, null)).Count();

    // Results:
    //   - blobExists : false
    //   - blobBlockCount : 1
}
CloudBlockBlob.Exists()即使存在未提交的块数据,也会返回false。
为了确定“不存在”的Blob实际上存在并且有未提交的块,请使用DownloadBlockList()
我不喜欢这个解决方案,因为它效率低下,并且依赖于异常。
我认为问题在于由未提交的块组成的Blob处于一种僵尸状态,在Azure Storage API方面既存在又不存在!
理想情况下,我想知道一个Blob:
- 根本不存在 - 有未提交的块 - 存在且块已提交
您有什么想法来实现这一点吗?
1个回答

1

您特别想确定 Azure BlockBlob 中是否存在未提交的块的原因是什么?

在调用 Put Block List 后,列表中指定的所有未提交块将作为新 Blob 的一部分提交。未在 Blob 列表中指定的任何未提交块都将被“垃圾回收”并从 Blob 服务中删除。如果在最后一个成功的 Put Block 操作后一周内没有对同一 Blob 进行 Put BlockPut Block List 的成功调用,则也将对所有未提交块进行“垃圾回收”。如果在该 Blob 上调用 Put Blob,则会对任何未提交块进行“垃圾回收”。

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


我正在使用两个无状态的Azure函数:上传块和发布提交块。我希望发布函数检查是否存在未提交块的Blob。我知道垃圾收集器的存在。如果发布函数从未被调用,我计划使用此机制,并让Azure收集未提交的块。 - AntoineC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接