为什么ListBlobsSegmentedAsync仅在第二页上返回结果?

时间:2016-01-29 21:57:06

标签: c# azure azure-storage-blobs

问题

我正在尝试抓取一页最多5000个blob,没有前缀。有问题的容器中大约有26,000个斑点。我在第一页上一直没有得到任何结果,但我注意到返回的BlobContinuationToken不是空的,所以我可以再次翻页并在第二页上获得结果。 为什么第一页上没有任何结果,但第二页上有结果?

我希望能够做到这一点,只抓一页:

var response = await container.ListBlobsSegmentedAsync(null).ConfigureAwait(false);

但是这没有返回结果,所以相反,我必须再次调用它,传递continuationToken,此时我会得到结果。

我考虑的是

  • 只有在容器变小(过去常常有超过100,000个blob)时才会发生这种情况。
  • 我在这个容器上经常删除,但我找不到任何说这会影响可用性的内容
  • 我尝试将true传递给useFlatBlobListing但它没有改变任何东西,但我真的不明白这个选项(据我所知,我的容器内容是平的)
  • 我之前使用过ListBlobsSegmentedAsync并且从未注意到这个问题(但容器更大)
  • 我使用的是Storage SDK的4.3.0版,已经过时了。我尝试更新,但它没有解决问题,所以我回去了
  • 我尝试过传递null continuationToken以及new BlobContinuationToken()。我不确定是否更适合
  • 我可以通过Visual Studio中的Cloud Explorer验证容器中仍有26,000个blob,但不能在结果的第一页上的代码中验证。我想知道Cloud Explorer的用途是什么?

编辑并进行更多故障排除

在一个较大的容器上,一段时间后它开始进行两次以上的页面提取以获得结果。每个页面提取(包括空页面)大约需要5秒钟,直到它最终返回结果。我看到它在峰值时最多需要12页提取,总计超过60秒才能在一个容量超过300,000的容器上返回结果。这是在对容器进行大量删除后不久。

1 个答案:

答案 0 :(得分:3)

您可以偶尔获得空页或具有小于最大结果的页面以及延续令牌,这一点都不出意外。如果返回的延续令牌将您带到下一页,为什么会出现问题?如果你不想处理延续令牌,那么ListBlobs(不是分段版本)会给你一个迭代器,它会懒得获得更多blob并为你追随延续令牌。

至于根本原因,可能会发生很多原因。我的猜测实际上是你的情况经常删除,但这是一个猜测。返回少于最大结果的数量并且由于多种原因而继续发生,但我怀疑这里有一对:1。我们达到服务器端超时,所以我们返回到目前为止的内容2.命中分区的边缘当blob列表很大并且可能跨越多台机器时,会更频繁地发生。如果你经常删除blob并且有很多东西可能需要一些时间来实际垃圾收集,所以我们会把所有时间花在扫描我们不会返回的东西上。