2
0
mirror of synced 2025-02-24 06:38:14 +00:00

ResponsiveDownloadStrategy will readahead blocks

Test peers don't play well with short "up request" buffers, so we need to fill
these with the most likely blocks to achieve maximum download speeds.
This commit is contained in:
Matt Joiner 2014-05-23 00:33:07 +10:00
parent 8022c09b90
commit 96f85be99a
2 changed files with 21 additions and 1 deletions

View File

@ -130,6 +130,7 @@ func (cl *Client) TorrentReadAt(ih InfoHash, off int64, p []byte) (n int, err er
err = io.EOF
return
}
t.lastReadPiece = int(index)
piece := t.Pieces[index]
if !piece.EverHashed {
cl.queuePieceCheck(t, index)
@ -714,8 +715,26 @@ type ResponsiveDownloadStrategy struct{}
func (ResponsiveDownloadStrategy) FillRequests(t *torrent, c *connection) {
for e := t.Priorities.Front(); e != nil; e = e.Next() {
if !c.Request(e.Value.(request)) {
return
}
}
for i := t.lastReadPiece; i < t.lastReadPiece+5 && i < t.NumPieces(); i++ {
for cs := range t.Pieces[i].PendingChunkSpecs {
if !c.Request(request{pp.Integer(i), cs}) {
return
}
}
}
// Then finish off incomplete pieces in order of bytes remaining.
for _, index := range t.piecesByPendingBytes() {
if t.PieceNumPendingBytes(index) == t.PieceLength(index) {
break
}
for chunkSpec := range t.Pieces[index].PendingChunkSpecs {
if !c.Request(request{index, chunkSpec}) {
return
}
}
}
}

View File

@ -34,7 +34,8 @@ type torrent struct {
Priorities *list.List
// BEP 12 Multitracker Metadata Extension. The tracker.Client instances
// mirror their respective URLs from the announce-list key.
Trackers [][]tracker.Client
Trackers [][]tracker.Client
lastReadPiece int
}
func (t *torrent) String() string {