diff --git a/server/torr/storage/torrstor/cache.go b/server/torr/storage/torrstor/cache.go index e887841..1a5f56b 100644 --- a/server/torr/storage/torrstor/cache.go +++ b/server/torr/storage/torrstor/cache.go @@ -215,7 +215,10 @@ func (c *Cache) getRemPieces() []*Piece { ranges := make([]Range, 0) c.muReaders.Lock() for r, _ := range c.readers { - ranges = append(ranges, r.getPiecesRange()) + r.checkReader() + if r.isUse { + ranges = append(ranges, r.getPiecesRange()) + } } c.muReaders.Unlock() ranges = mergeRange(ranges) @@ -243,6 +246,9 @@ func (c *Cache) getRemPieces() []*Piece { c.muReaders.Lock() for r, _ := range c.readers { + if !r.isUse { + continue + } if c.isIdInFileBE(ranges, r.getReaderPiece()) { continue } @@ -336,7 +342,10 @@ func (c *Cache) clearPriority() { ranges := make([]Range, 0) c.muReaders.Lock() for r, _ := range c.readers { - ranges = append(ranges, r.getPiecesRange()) + r.checkReader() + if r.isUse { + ranges = append(ranges, r.getPiecesRange()) + } } c.muReaders.Unlock() ranges = mergeRange(ranges) diff --git a/server/torr/storage/torrstor/reader.go b/server/torr/storage/torrstor/reader.go index b4188ba..bd04756 100644 --- a/server/torr/storage/torrstor/reader.go +++ b/server/torr/storage/torrstor/reader.go @@ -23,6 +23,7 @@ type Reader struct { ///Preload lastAccess int64 + isUse bool muPreload sync.Mutex ranges Range } @@ -94,7 +95,7 @@ func (r *Reader) Read(p []byte) (n int, err error) { } 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 r.Reader.SetReadahead(0) r.readahead = 0 @@ -143,14 +144,8 @@ func (r *Reader) getPieceNum(offset int64) int { } 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) - readers := int64(len(r.cache.readers)) + readers := int64(r.getUseReaders()) if readers == 0 { readers = 1 } @@ -167,3 +162,27 @@ func (r *Reader) getOffsetRange() (int64, int64) { } 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 +}