fix reload pieces in unused reader

This commit is contained in:
YouROK
2021-10-14 23:15:26 +03:00
parent a4cf9c8586
commit ffed0cdec6
2 changed files with 38 additions and 10 deletions

View File

@@ -215,7 +215,10 @@ func (c *Cache) getRemPieces() []*Piece {
ranges := make([]Range, 0) ranges := make([]Range, 0)
c.muReaders.Lock() c.muReaders.Lock()
for r, _ := range c.readers { for r, _ := range c.readers {
ranges = append(ranges, r.getPiecesRange()) r.checkReader()
if r.isUse {
ranges = append(ranges, r.getPiecesRange())
}
} }
c.muReaders.Unlock() c.muReaders.Unlock()
ranges = mergeRange(ranges) ranges = mergeRange(ranges)
@@ -243,6 +246,9 @@ func (c *Cache) getRemPieces() []*Piece {
c.muReaders.Lock() c.muReaders.Lock()
for r, _ := range c.readers { for r, _ := range c.readers {
if !r.isUse {
continue
}
if c.isIdInFileBE(ranges, r.getReaderPiece()) { if c.isIdInFileBE(ranges, r.getReaderPiece()) {
continue continue
} }
@@ -336,7 +342,10 @@ func (c *Cache) clearPriority() {
ranges := make([]Range, 0) ranges := make([]Range, 0)
c.muReaders.Lock() c.muReaders.Lock()
for r, _ := range c.readers { for r, _ := range c.readers {
ranges = append(ranges, r.getPiecesRange()) r.checkReader()
if r.isUse {
ranges = append(ranges, r.getPiecesRange())
}
} }
c.muReaders.Unlock() c.muReaders.Unlock()
ranges = mergeRange(ranges) ranges = mergeRange(ranges)

View File

@@ -23,6 +23,7 @@ type Reader struct {
///Preload ///Preload
lastAccess int64 lastAccess int64
isUse bool
muPreload sync.Mutex muPreload sync.Mutex
ranges Range ranges Range
} }
@@ -94,7 +95,7 @@ func (r *Reader) Read(p []byte) (n int, err error) {
} }
func (r *Reader) SetReadahead(length int64) { func (r *Reader) SetReadahead(length int64) {
if time.Now().Unix() > r.lastAccess+60 && r.cache != nil && len(r.cache.readers) > 1 { if !r.isUse && r.cache != nil {
//fix read a head on not readed reader //fix read a head on not readed reader
r.Reader.SetReadahead(0) r.Reader.SetReadahead(0)
r.readahead = 0 r.readahead = 0
@@ -143,14 +144,8 @@ func (r *Reader) getPieceNum(offset int64) int {
} }
func (r *Reader) getOffsetRange() (int64, int64) { func (r *Reader) getOffsetRange() (int64, int64) {
if time.Now().Unix() > r.lastAccess+60 && len(r.cache.readers) > 1 {
r.SetReadahead(0)
return r.file.Offset(), r.file.Offset()
}
prc := int64(settings.BTsets.ReaderReadAHead) prc := int64(settings.BTsets.ReaderReadAHead)
readers := int64(len(r.cache.readers)) readers := int64(r.getUseReaders())
if readers == 0 { if readers == 0 {
readers = 1 readers = 1
} }
@@ -167,3 +162,27 @@ func (r *Reader) getOffsetRange() (int64, int64) {
} }
return beginOffset, endOffset return beginOffset, endOffset
} }
func (r *Reader) checkReader() {
if time.Now().Unix() > r.lastAccess+60 && len(r.cache.readers) > 1 {
r.SetReadahead(0)
r.isUse = false
if r.offset > 0 {
r.Reader.Seek(0, io.SeekStart)
}
} else {
r.isUse = true
}
}
func (r *Reader) getUseReaders() int {
readers := 1
if r.cache != nil {
for reader, _ := range r.cache.readers {
if reader.isUse {
readers++
}
}
}
return readers
}