fix races in preload

This commit is contained in:
nikk gitanes
2023-04-09 04:46:01 +03:00
parent 42da0ba3d7
commit 2dfa2fe227
2 changed files with 25 additions and 19 deletions

View File

@@ -77,6 +77,11 @@ func (t *Torrent) Preload(index int, size int64) {
} }
} }
if t.Stat == state.TorrentClosed {
log.TLogln("End preload: torrent closed")
return
}
// startend -> 8/16 MB // startend -> 8/16 MB
startend := t.Info().PieceLength startend := t.Info().PieceLength
if startend < 8*1024*1024 { if startend < 8*1024*1024 {
@@ -101,27 +106,29 @@ func (t *Torrent) Preload(index int, size int64) {
readerEndStart := file.Length() - startend readerEndStart := file.Length() - startend
readerEndEnd := file.Length() readerEndEnd := file.Length()
var wa sync.WaitGroup var wg sync.WaitGroup
go func() { go func() {
offset := int64(0) offset := int64(0)
if readerEndStart > readerStartEnd { if readerEndStart > readerStartEnd {
// Если конечный ридер не входит в диапозон начального // Если конечный ридер не входит в диапозон начального
wa.Add(1) wg.Add(1)
defer wa.Done() defer wg.Done()
readerEnd := file.NewReader() if t.Stat == state.TorrentPreload {
readerEnd.SetResponsive() readerEnd := file.NewReader()
readerEnd.SetReadahead(0) readerEnd.SetResponsive()
readerEnd.Seek(readerEndStart, io.SeekStart) readerEnd.SetReadahead(0)
offset = readerEndStart readerEnd.Seek(readerEndStart, io.SeekStart)
tmp := make([]byte, 32768, 32768) offset = readerEndStart
for offset+int64(len(tmp)) < readerEndEnd { tmp := make([]byte, 32768)
n, err := readerEnd.Read(tmp) for offset+int64(len(tmp)) < readerEndEnd {
if err != nil { n, err := readerEnd.Read(tmp)
break if err != nil {
break
}
offset += int64(n)
} }
offset += int64(n) readerEnd.Close()
} }
readerEnd.Close()
} }
}() }()
@@ -132,7 +139,7 @@ func (t *Torrent) Preload(index int, size int64) {
} }
readerStart.SetReadahead(readahead) readerStart.SetReadahead(readahead)
offset := int64(0) offset := int64(0)
tmp := make([]byte, 32768, 32768) tmp := make([]byte, 32768)
for offset+int64(len(tmp)) < readerStartEnd { for offset+int64(len(tmp)) < readerStartEnd {
n, err := readerStart.Read(tmp) n, err := readerStart.Read(tmp)
if err != nil { if err != nil {
@@ -146,7 +153,7 @@ func (t *Torrent) Preload(index int, size int64) {
} }
} }
wa.Wait() wg.Wait()
} }
log.TLogln("End preload:", file.Torrent().InfoHash().HexString(), "Peers:[", t.Torrent.Stats().ConnectedSeeders, "]", t.Torrent.Stats().ActivePeers, "/", t.Torrent.Stats().TotalPeers) log.TLogln("End preload:", file.Torrent().InfoHash().HexString(), "Peers:[", t.Torrent.Stats().ConnectedSeeders, "]", t.Torrent.Stats().ActivePeers, "/", t.Torrent.Stats().TotalPeers)
} }

View File

@@ -104,10 +104,9 @@ func (c *Cache) Close() error {
} }
} }
c.pieces = nil
c.muReaders.Lock() c.muReaders.Lock()
c.readers = nil c.readers = nil
c.pieces = nil
c.muReaders.Unlock() c.muReaders.Unlock()
utils.FreeOSMemGC() utils.FreeOSMemGC()