This commit is contained in:
YouROK
2021-02-19 09:23:33 +03:00
parent 52dfc0e136
commit 5a84e88f42
2 changed files with 35 additions and 60 deletions

View File

@@ -6,6 +6,7 @@ import (
"github.com/anacrolix/torrent" "github.com/anacrolix/torrent"
"server/log" "server/log"
"server/settings"
) )
type Reader struct { type Reader struct {
@@ -61,7 +62,6 @@ func (r *Reader) Read(p []byte) (n int, err error) {
if r.file.Torrent() != nil && r.file.Torrent().Info() != nil { if r.file.Torrent() != nil && r.file.Torrent().Info() != nil {
n, err = r.Reader.Read(p) n, err = r.Reader.Read(p)
r.offset += int64(n) r.offset += int64(n)
//go r.preload()
} else { } else {
log.TLogln("Torrent closed and readed") log.TLogln("Torrent closed and readed")
} }
@@ -113,3 +113,37 @@ func (c *Cache) CloseReader(r *Reader) {
delete(r.cache.readers, r) delete(r.cache.readers, r)
r.cache.muReaders.Unlock() r.cache.muReaders.Unlock()
} }
func (r *Reader) getPiecesRange() Range {
startOff, endOff := r.getOffsetRange()
return Range{r.getPieceNum(startOff), r.getPieceNum(endOff)}
}
func (r *Reader) getReaderPiece() int {
readerOff := r.offset
return r.getPieceNum(readerOff)
}
func (r *Reader) getPieceNum(offset int64) int {
return int((offset + r.file.Offset()) / r.cache.pieceLength)
}
func (r *Reader) getOffsetRange() (int64, int64) {
prc := int64(settings.BTsets.ReaderReadAHead)
readers := int64(len(r.cache.readers))
if readers == 0 {
readers = 1
}
beginOffset := r.offset - (r.cache.capacity/readers)*(100-prc)/100
endOffset := r.offset + (r.cache.capacity/readers)*prc/100
if beginOffset < 0 {
beginOffset = 0
}
if endOffset > r.file.Length() {
endOffset = r.file.Length()
}
return beginOffset, endOffset
}

View File

@@ -1,59 +0,0 @@
package torrstor
import (
"github.com/anacrolix/torrent"
"server/settings"
)
func (r *Reader) getPiecesRange() Range {
startOff, endOff := r.getOffsetRange()
return Range{r.getPieceNum(startOff), r.getPieceNum(endOff)}
}
func (r *Reader) getReaderPiece() int {
readerOff := r.offset
return r.getPieceNum(readerOff)
}
func (r *Reader) getPieceNum(offset int64) int {
return int((offset + r.file.Offset()) / r.cache.pieceLength)
}
func (r *Reader) getOffsetRange() (int64, int64) {
prc := int64(settings.BTsets.ReaderReadAHead)
readers := int64(len(r.cache.readers))
if readers == 0 {
readers = 1
}
beginOffset := r.offset - (r.cache.capacity/readers)*(100-prc)/100
endOffset := r.offset + (r.cache.capacity/readers)*prc/100
if beginOffset < 0 {
beginOffset = 0
}
if endOffset > r.file.Length() {
endOffset = r.file.Length()
}
return beginOffset, endOffset
}
func (r *Reader) preload() {
rrange := r.getPiecesRange()
if rrange.Start == r.ranges.Start && rrange.End == r.ranges.End {
return
}
torr := r.file.Torrent()
r.ranges = rrange
rahPiece := int(r.readahead / torr.Info().PieceLength)
readerPiece := r.getReaderPiece()
// from reader readahead to end of range
for i := readerPiece + rahPiece; i < rrange.End; i++ {
if torr.Piece(i).State().Priority == torrent.PiecePriorityNone {
torr.Piece(i).SetPriority(torrent.PiecePriorityNormal)
}
}
}