in oss/filelike.go [295:352]
func (f *ReadOnlyFile) readInternal(offset int64, p []byte) (bytesRead int, err error) {
defer func() {
if bytesRead > 0 {
f.readBufOffset += int64(bytesRead)
f.seqReadAmount += int64(bytesRead)
}
}()
if offset >= f.sizeInBytes {
err = io.EOF
return
}
if f.readBufOffset != offset {
f.readBufOffset = offset
f.seqReadAmount = 0
if f.reader != nil {
f.reader.Close()
f.reader = nil
}
if f.asyncReaders != nil {
f.numOOORead++
}
for _, ar := range f.asyncReaders {
ar.Close()
}
f.asyncReaders = nil
}
if f.enablePrefetch && f.seqReadAmount >= f.prefetchThreshold && f.numOOORead < f.oooReadThreshold {
//swith to async reader
if f.reader != nil {
f.reader.Close()
f.reader = nil
}
err = f.prefetch(offset, len(p))
if err == nil {
bytesRead, err = f.readFromPrefetcher(offset, p)
if err == nil {
return
}
}
// fall back to read serially
f.seqReadAmount = 0
for _, ar := range f.asyncReaders {
ar.Close()
}
f.asyncReaders = nil
}
bytesRead, err = f.readDirect(offset, p)
return
}