Azure Page Blob OpenRead的获取次数不超过StreamMinimumReadSizeInBytes

时间:2016-11-20 04:45:34

标签: azure-storage-blobs

我有一个包含有效日志数据的页面blob。一切正常,直到日志填满2 MB。

在阅读时,我正在使用OpenReadAsync方法来获取从中读取数据的流。在调用OpenReadAsync之前,我将StreamMinimumReadSizeInBytes设置为2MB(2 * 1024 * 1024)。

打开流后,我使用以下方法读出数据。

public IEnumerable<object> Read(Stream pageAlignedEventStream, long? maxBytes = null)
    {
        while (pageAlignedEventStream.Position < (maxBytes ?? pageAlignedEventStream.Length))
        {
            byte[] bytesToReadBuffer = new byte[LongZero.Length];
            pageAlignedEventStream.Read(bytesToReadBuffer, 0, LongZero.Length);
            long bytesToRead = BitConverter.ToInt64(bytesToReadBuffer, 0);

            if (bytesToRead == 0)
            {
                yield break;
            }

            if (bytesToRead < 0)
            {
                throw new InvalidOperationException("Invalid size specification.  Stream may be corrupted.");
            }

            if (bytesToRead > Int32.MaxValue)
            {
                throw new InvalidOperationException("Payload size is too large.");
            }

            byte[] payload = new byte[bytesToRead];                
            int read = pageAlignedEventStream.Read(payload, 0, (int) bytesToRead);

            if (read != bytesToRead)
            {
                // when fails, read == 503, bytesToRead = 3575, position = 2MB (2*1024*14024)
                throw new InvalidOperationException("Did not read expected number of bytes.");
            }

            yield return this.EventSerializer.DeserializeFromStream(new MemoryStream(payload, false));

            var paddedSpaceToSkip = PagesRequired(bytesToRead) * PageSizeBytes - bytesToRead - LongZero.Length;
            pageAlignedEventStream.Position += paddedSpaceToSkip;
        }

        yield break;
    } 

如代码中的注释所述,当位置达到指定的2MB时,会发生故障。在返回之前,读取无法提取额外的字节,只读取503个字节而不是预期的3575个字节。

我的期望是,当我读过缓冲区大小时,会下载更多数据。

我在Azure Feedback上发现了一个类似的问题,但链接问题表明非2次幂缓存,但2MB肯定是2的幂。

1 个答案:

答案 0 :(得分:0)

即使我将CloudPageBlob的StreamMinimumReadSizeInBytes property设置为2MB,我也可以获取存储在页面blob中的所有数据(大小= 3MB)。

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
                    CloudConfigurationManager.GetSetting("StorageConnectionString"));

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

CloudBlobContainer container = blobClient.GetContainerReference("mycontainername");

container.CreateIfNotExists();

CloudPageBlob pageBlob = container.GetPageBlobReference("mypageblob");

pageBlob.StreamMinimumReadSizeInBytes = 2 * 1024 * 1024;

Task<Stream> pageAlignedEventStream = pageBlob.OpenReadAsync();
  

读取在返回之前无法提取额外的字节,只读取503个字节而不是预期的3575个字节。

如果当前没有多个字节可用且已到达流的末尾,则返回的值可能小于请求的字节数。请调试代码以跟踪 paddedSpaceToSkip 变量的变化,并检查代码逻辑是否符合预期。