package filer type ReaderPattern struct { isSequentialCounter int64 lastReadStopOffset int64 } // For streaming read: only cache the first chunk // For random read: only fetch the requested range, instead of the whole chunk func NewReaderPattern() *ReaderPattern { return &ReaderPattern{ isSequentialCounter: 0, lastReadStopOffset: 0, } } func (rp *ReaderPattern) MonitorReadAt(offset int64, size int) { if rp.lastReadStopOffset == offset { rp.isSequentialCounter++ } else { rp.isSequentialCounter-- } rp.lastReadStopOffset = offset + int64(size) } func (rp *ReaderPattern) IsRandomMode() bool { return rp.isSequentialCounter >= 0 }