func()

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
}