From 2ff4b8335307d1a6e9163e44201eee0cb565793f Mon Sep 17 00:00:00 2001 From: YouROK <8yourok8@mail.ru> Date: Tue, 22 Dec 2020 13:16:08 +0300 Subject: [PATCH] fix and refactor reader --- src/server/torr/storage/torrstor/cache.go | 55 +++++-------------- src/server/torr/storage/torrstor/reader.go | 5 +- .../torr/storage/torrstor/readerloader.go | 4 -- 3 files changed, 17 insertions(+), 47 deletions(-) diff --git a/src/server/torr/storage/torrstor/cache.go b/src/server/torr/storage/torrstor/cache.go index 7cb66c0..23d2f45 100644 --- a/src/server/torr/storage/torrstor/cache.go +++ b/src/server/torr/storage/torrstor/cache.go @@ -238,21 +238,23 @@ func (c *Cache) getRemPieces() []*Piece { ranges = mergeRange(ranges) for id, p := range c.pieces { + if p.Size > 0 { + fill += p.Size + } if len(ranges) > 0 { - for _, rr := range ranges { - if id < rr.Start || id > rr.End { - if c.torrent.Piece(id).State().Priority != torrent.PiecePriorityNone { - c.torrent.Piece(id).SetPriority(torrent.PiecePriorityNone) - } - if p.Size > 0 { - fill += p.Size - piecesRemove = append(piecesRemove, p) - } + if !inRanges(ranges, id) { + piece := c.torrent.Piece(id) + if piece.State().Priority != torrent.PiecePriorityNone { + piece.SetPriority(torrent.PiecePriorityNone) + } + if p.Size > 0 { + piecesRemove = append(piecesRemove, p) } } } else { - if c.torrent.Piece(id).State().Priority != torrent.PiecePriorityNone { - c.torrent.Piece(id).SetPriority(torrent.PiecePriorityNone) + piece := c.torrent.Piece(id) + if piece.State().Priority != torrent.PiecePriorityNone { + piece.SetPriority(torrent.PiecePriorityNone) } } } @@ -264,34 +266,3 @@ func (c *Cache) getRemPieces() []*Piece { c.filled = fill return piecesRemove } - -func mergeRange(ranges []Range) []Range { - if len(ranges) <= 1 { - return ranges - } - // copy ranges - merged := append([]Range(nil), ranges...) - - sort.Slice(merged, func(i, j int) bool { - if merged[i].Start < merged[j].Start { - return true - } - if merged[i].Start == merged[j].Start && merged[i].End < merged[j].End { - return true - } - return false - }) - - j := 0 - for i := 1; i < len(merged); i++ { - if merged[j].End >= merged[i].Start { - if merged[j].End < merged[i].End { - merged[j].End = merged[i].End - } - } else { - j++ - merged[j] = merged[i] - } - } - return merged[:j+1] -} diff --git a/src/server/torr/storage/torrstor/reader.go b/src/server/torr/storage/torrstor/reader.go index c4d604a..dd6b803 100644 --- a/src/server/torr/storage/torrstor/reader.go +++ b/src/server/torr/storage/torrstor/reader.go @@ -48,7 +48,7 @@ func (r *Reader) Seek(offset int64, whence int) (n int64, err error) { case io.SeekCurrent: r.offset += offset case io.SeekEnd: - r.offset = r.file.Length() - offset + r.offset = r.file.Length() + offset } n, err = r.Reader.Seek(offset, whence) r.offset = n @@ -93,6 +93,9 @@ func (r *Reader) Close() { // TODO провверить как будут закрываться ридеры r.mu.Lock() r.isClosed = true + if len(r.file.Torrent().Files()) > 0 { + r.Reader.Close() + } r.mu.Unlock() go r.cache.getRemPieces() } diff --git a/src/server/torr/storage/torrstor/readerloader.go b/src/server/torr/storage/torrstor/readerloader.go index 9987607..40566dc 100644 --- a/src/server/torr/storage/torrstor/readerloader.go +++ b/src/server/torr/storage/torrstor/readerloader.go @@ -5,10 +5,6 @@ import ( "server/settings" ) -type Range struct { - Start, End int -} - func (r *Reader) getPiecesRange() Range { startOff, endOff := r.getOffsetRange() return Range{r.getPieceNum(startOff), r.getPieceNum(endOff)}