【发布时间】:2017-04-03 16:55:24
【问题描述】:
我有一个包含有效日志数据的页面 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;
}
如代码中的 cmets 所述,失败发生在位置达到指定的 2MB 时。读取无法在返回之前提取额外的字节,并且仅读取 503 个字节而不是预期的 3575 个字节。
我的期望是,当我读取超过缓冲区大小时,它会下载更多数据。
我在 Azure Feedback 上发现了类似的问题,但链接的问题表明缓冲区大小不是 2 的幂,但 2MB 绝对是 2 的幂。
【问题讨论】: