mirror of
https://github.com/Ernous/TorrServerJellyfin.git
synced 2025-12-21 22:46:09 +05:00
fix buffering cache
This commit is contained in:
@@ -27,7 +27,8 @@ type Cache struct {
|
||||
pieces map[int]*Piece
|
||||
bufferPull *BufferPool
|
||||
|
||||
readers map[*Reader]struct{}
|
||||
readers map[*Reader]struct{}
|
||||
muReaders sync.Mutex
|
||||
|
||||
isRemove bool
|
||||
muRemove sync.Mutex
|
||||
@@ -80,7 +81,14 @@ func (c *Cache) Close() error {
|
||||
}
|
||||
c.pieces = nil
|
||||
c.bufferPull = nil
|
||||
|
||||
c.muReaders.Lock()
|
||||
for reader, _ := range c.readers {
|
||||
reader.Close()
|
||||
}
|
||||
c.readers = nil
|
||||
c.muReaders.Unlock()
|
||||
|
||||
utils.FreeOSMemGC()
|
||||
return nil
|
||||
}
|
||||
@@ -94,9 +102,11 @@ func (c *Cache) AdjustRA(readahead int64) {
|
||||
if settings.BTsets.CacheSize == 0 {
|
||||
c.capacity = readahead * 3
|
||||
}
|
||||
c.muReaders.Lock()
|
||||
for r, _ := range c.readers {
|
||||
r.SetReadahead(readahead)
|
||||
}
|
||||
c.muReaders.Unlock()
|
||||
}
|
||||
|
||||
func (c *Cache) GetState() *state.CacheState {
|
||||
@@ -121,6 +131,7 @@ func (c *Cache) GetState() *state.CacheState {
|
||||
}
|
||||
}
|
||||
|
||||
c.muReaders.Lock()
|
||||
for r, _ := range c.readers {
|
||||
start, end := r.getUsedPieces()
|
||||
if p, ok := c.pieces[start]; ok {
|
||||
@@ -159,6 +170,7 @@ func (c *Cache) GetState() *state.CacheState {
|
||||
}
|
||||
}
|
||||
}
|
||||
c.muReaders.Unlock()
|
||||
|
||||
c.filled = fill
|
||||
cState.Filled = c.filled
|
||||
@@ -199,12 +211,14 @@ func (c *Cache) getRemPieces() []*Piece {
|
||||
for id, p := range c.pieces {
|
||||
if p.Size > 0 {
|
||||
fill += p.Size
|
||||
c.muReaders.Lock()
|
||||
for r, _ := range c.readers {
|
||||
start, end := r.getUsedPieces()
|
||||
if id < start || id > end {
|
||||
piecesRemove = append(piecesRemove, p)
|
||||
}
|
||||
}
|
||||
c.muReaders.Unlock()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,9 +28,12 @@ func NewReader(file *torrent.File, cache *Cache) *Reader {
|
||||
r.file = file
|
||||
r.Reader = file.NewReader()
|
||||
|
||||
r.SetReadAHead(0)
|
||||
r.SetReadahead(0)
|
||||
r.cache = cache
|
||||
r.cache.readers[r] = struct{}{}
|
||||
|
||||
cache.muReaders.Lock()
|
||||
cache.readers[r] = struct{}{}
|
||||
cache.muReaders.Unlock()
|
||||
return r
|
||||
}
|
||||
|
||||
@@ -65,7 +68,7 @@ func (r *Reader) Read(p []byte) (n int, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (r *Reader) SetReadAHead(length int64) {
|
||||
func (r *Reader) SetReadahead(length int64) {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
r.Reader.SetReadahead(length)
|
||||
@@ -84,7 +87,11 @@ func (r *Reader) Close() error {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
r.isClosed = true
|
||||
|
||||
r.cache.muReaders.Lock()
|
||||
delete(r.cache.readers, r)
|
||||
r.cache.muReaders.Unlock()
|
||||
|
||||
return r.Reader.Close()
|
||||
}
|
||||
|
||||
@@ -93,6 +100,11 @@ func (c *Cache) NewReader(file *torrent.File) *Reader {
|
||||
}
|
||||
|
||||
func (c *Cache) Readers() int {
|
||||
if c == nil {
|
||||
return 0
|
||||
}
|
||||
c.muReaders.Lock()
|
||||
defer c.muReaders.Unlock()
|
||||
if c == nil || c.readers == nil {
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package torrstor
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/dustin/go-humanize"
|
||||
"server/log"
|
||||
)
|
||||
|
||||
@@ -15,8 +16,7 @@ func (r *Reader) getUsedPieces() (int, int) {
|
||||
}
|
||||
|
||||
func (r *Reader) preload() {
|
||||
r.currOffsetPreload = r.offset
|
||||
r.endOffsetPreload = r.offset + r.cache.capacity
|
||||
r.endOffsetPreload = r.offset + r.cache.capacity - 1024
|
||||
|
||||
if r.endOffsetPreload > r.file.Length() {
|
||||
r.endOffsetPreload = r.file.Length()
|
||||
@@ -27,7 +27,7 @@ func (r *Reader) preload() {
|
||||
}
|
||||
|
||||
r.isPreload = true
|
||||
|
||||
log.TLogln("Start buffering from", humanize.IBytes(uint64(r.currOffsetPreload)))
|
||||
go func() {
|
||||
buffReader := r.file.NewReader()
|
||||
defer func() {
|
||||
@@ -35,6 +35,7 @@ func (r *Reader) preload() {
|
||||
buffReader.Close()
|
||||
}()
|
||||
buffReader.SetReadahead(0)
|
||||
r.currOffsetPreload = r.offset + r.readahead
|
||||
buffReader.Seek(r.currOffsetPreload, io.SeekStart)
|
||||
buff := make([]byte, 1024)
|
||||
for r.currOffsetPreload < r.endOffsetPreload && !r.isClosed {
|
||||
@@ -44,7 +45,14 @@ func (r *Reader) preload() {
|
||||
return
|
||||
}
|
||||
r.currOffsetPreload += int64(off)
|
||||
r.endOffsetPreload = r.offset + r.cache.capacity - 1024
|
||||
if r.currOffsetPreload < r.offset {
|
||||
r.currOffsetPreload = r.offset + r.readahead
|
||||
buffReader.Seek(r.currOffsetPreload, io.SeekStart)
|
||||
}
|
||||
//log.TLogln(humanize.IBytes(uint64(r.offset)), humanize.IBytes(uint64(r.currOffsetPreload)), humanize.IBytes(uint64(r.endOffsetPreload)))
|
||||
}
|
||||
log.TLogln("End buffering")
|
||||
}()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user