in oss/filelike.go [71:147]
func NewReadOnlyFile(ctx context.Context, c OpenFileAPIClient, bucket string, key string, optFns ...func(*OpenOptions)) (*ReadOnlyFile, error) {
options := OpenOptions{
Offset: 0,
EnablePrefetch: false,
PrefetchNum: DefaultPrefetchNum,
ChunkSize: DefaultPrefetchChunkSize,
PrefetchThreshold: DefaultPrefetchThreshold,
OutOfOrderReadThreshold: DefaultOutOfOrderReadThreshold,
}
for _, fn := range optFns {
fn(&options)
}
if options.EnablePrefetch {
var chunkSize int64
if options.ChunkSize > 0 {
chunkSize = (options.ChunkSize + AsyncReadeBufferSize - 1) / AsyncReadeBufferSize * AsyncReadeBufferSize
} else {
chunkSize = DefaultPrefetchChunkSize
}
options.ChunkSize = chunkSize
if options.PrefetchNum <= 0 {
options.PrefetchNum = DefaultPrefetchNum
}
if options.OutOfOrderReadThreshold <= int64(0) {
options.OutOfOrderReadThreshold = DefaultOutOfOrderReadThreshold
}
}
f := &ReadOnlyFile{
client: c,
context: ctx,
bucket: bucket,
key: key,
versionId: options.VersionId,
requestPayer: options.RequestPayer,
offset: options.Offset,
enablePrefetch: options.EnablePrefetch,
prefetchNum: options.PrefetchNum,
chunkSize: options.ChunkSize,
prefetchThreshold: options.PrefetchThreshold,
oooReadThreshold: options.OutOfOrderReadThreshold,
}
result, err := f.client.HeadObject(f.context, &HeadObjectRequest{
Bucket: &f.bucket,
Key: &f.key,
VersionId: f.versionId,
RequestPayer: f.requestPayer,
})
if err != nil {
return nil, err
}
//File info
f.sizeInBytes = result.ContentLength
f.modTime = result.Headers.Get(HTTPHeaderLastModified)
f.etag = result.Headers.Get(HTTPHeaderETag)
f.headers = result.Headers
if f.sizeInBytes < 0 {
return nil, fmt.Errorf("file size is invaid, got %v", f.sizeInBytes)
}
if f.offset > f.sizeInBytes {
return nil, fmt.Errorf("offset is unavailable, offset:%v, file size:%v", f.offset, f.sizeInBytes)
}
return f, nil
}