in component/azstorage/block_blob.go [933:989]
func (bb *BlockBlob) ReadInBuffer(name string, offset int64, len int64, data []byte, etag *string) error {
// log.Trace("BlockBlob::ReadInBuffer : name %s", name)
if etag != nil {
*etag = ""
}
blobClient := bb.Container.NewBlobClient(filepath.Join(bb.Config.prefixPath, name))
ctx, cancel := context.WithTimeout(context.Background(), max_context_timeout*time.Minute)
defer cancel()
opt := &blob.DownloadStreamOptions{
Range: blob.HTTPRange{
Offset: offset,
Count: len,
},
CPKInfo: bb.blobCPKOpt,
}
downloadResponse, err := blobClient.DownloadStream(ctx, opt)
if err != nil {
e := storeBlobErrToErr(err)
if e == ErrFileNotFound {
return syscall.ENOENT
} else if e == InvalidRange {
return syscall.ERANGE
}
log.Err("BlockBlob::ReadInBufferWithETag : Failed to download blob %s [%s]", name, err.Error())
return err
}
var streamBody io.ReadCloser = downloadResponse.NewRetryReader(ctx, nil)
dataRead, err := io.ReadFull(streamBody, data)
if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {
log.Err("BlockBlob::ReadInBuffer : Failed to copy data from body to buffer for blob %s [%s]", name, err.Error())
return err
}
if dataRead < 0 {
log.Err("BlockBlob::ReadInBuffer : Failed to copy data from body to buffer for blob %s", name)
return errors.New("failed to copy data from body to buffer")
}
err = streamBody.Close()
if err != nil {
log.Err("BlockBlob::ReadInBuffer : Failed to close body for blob %s [%s]", name, err.Error())
}
if etag != nil {
*etag = sanitizeEtag(downloadResponse.ETag)
}
return nil
}