From 679814d4add42f42c0d950f804f49735939a44e7 Mon Sep 17 00:00:00 2001 From: YouROK <8yourok8@mail.ru> Date: Wed, 20 Oct 2021 15:22:20 +0300 Subject: [PATCH] fix speed --- server/torr/storage/torrstor/reader.go | 39 +++++++++++++++++++------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/server/torr/storage/torrstor/reader.go b/server/torr/storage/torrstor/reader.go index bd04756..1870a22 100644 --- a/server/torr/storage/torrstor/reader.go +++ b/server/torr/storage/torrstor/reader.go @@ -24,7 +24,7 @@ type Reader struct { ///Preload lastAccess int64 isUse bool - muPreload sync.Mutex + mu sync.Mutex ranges Range } @@ -35,6 +35,7 @@ func newReader(file *torrent.File, cache *Cache) *Reader { r.SetReadahead(0) r.cache = cache + r.isUse = true cache.muReaders.Lock() cache.readers[r] = struct{}{} @@ -54,6 +55,7 @@ func (r *Reader) Seek(offset int64, whence int) (n int64, err error) { case io.SeekEnd: r.offset = r.file.Length() + offset } + r.readerOn() n, err = r.Reader.Seek(offset, whence) r.offset = n r.lastAccess = time.Now().Unix() @@ -66,6 +68,7 @@ func (r *Reader) Read(p []byte) (n int, err error) { return } if r.file.Torrent() != nil && r.file.Torrent().Info() != nil { + r.readerOn() n, err = r.Reader.Read(p) //samsung tv fix xvid/divx @@ -95,16 +98,12 @@ func (r *Reader) Read(p []byte) (n int, err error) { } func (r *Reader) SetReadahead(length int64) { - if !r.isUse && r.cache != nil { - //fix read a head on not readed reader - r.Reader.SetReadahead(0) - r.readahead = 0 - return - } if r.cache != nil && length > r.cache.capacity { length = r.cache.capacity } - r.Reader.SetReadahead(length) + if r.isUse { + r.Reader.SetReadahead(length) + } r.readahead = length } @@ -165,13 +164,33 @@ func (r *Reader) getOffsetRange() (int64, int64) { func (r *Reader) checkReader() { if time.Now().Unix() > r.lastAccess+60 && len(r.cache.readers) > 1 { + r.readerOff() + } else { + r.readerOn() + } +} + +func (r *Reader) readerOn() { + r.mu.Lock() + defer r.mu.Unlock() + if !r.isUse { + if pos, err := r.Reader.Seek(0, io.SeekCurrent); err == nil && pos == 0 { + r.Reader.Seek(r.offset, io.SeekStart) + } + r.SetReadahead(r.readahead) + r.isUse = true + } +} + +func (r *Reader) readerOff() { + r.mu.Lock() + defer r.mu.Unlock() + if r.isUse { r.SetReadahead(0) r.isUse = false if r.offset > 0 { r.Reader.Seek(0, io.SeekStart) } - } else { - r.isUse = true } }