1234567891011121314151617181920212223242526272829303132333435363738394041 |
- package filer
- import (
- "sync/atomic"
- )
- type ReaderPattern struct {
- isSequentialCounter int64
- lastReadStopOffset int64
- }
- const ModeChangeLimit = 3
- // 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) {
- lastOffset := atomic.SwapInt64(&rp.lastReadStopOffset, offset+int64(size))
- counter := atomic.LoadInt64(&rp.isSequentialCounter)
- if lastOffset == offset {
- if counter < ModeChangeLimit {
- atomic.AddInt64(&rp.isSequentialCounter, 1)
- }
- } else {
- if counter > -ModeChangeLimit {
- atomic.AddInt64(&rp.isSequentialCounter, -1)
- }
- }
- }
- func (rp *ReaderPattern) IsRandomMode() bool {
- return atomic.LoadInt64(&rp.isSequentialCounter) < 0
- }
|