err = io.EOF
return
}
+ cl.readRaisePiecePriorities(t, off, int64(len(p)))
if len(p) > pieceLeft {
p = p[:pieceLeft]
}
if len(p) == 0 {
panic(len(p))
}
- cl.prioritizePiece(t, index, piecePriorityHigh)
- for i := index + 1; i < index+7 && i < t.NumPieces(); i++ {
- cl.prioritizePiece(t, i, piecePriorityNormal)
- }
for !piece.Complete() {
piece.Event.Wait()
}
return t.Data.ReadAt(p, off)
}
+func (cl *Client) readRaisePiecePriorities(t *torrent, off, _len int64) {
+ index := int(off / int64(t.UsualPieceSize()))
+ cl.raisePiecePriority(t, index, piecePriorityNow)
+ index++
+ if index >= t.NumPieces() {
+ return
+ }
+ cl.raisePiecePriority(t, index, piecePriorityNext)
+ for i := 0; i < 5; i++ {
+ index++
+ if index >= t.NumPieces() {
+ break
+ }
+ cl.raisePiecePriority(t, index, piecePriorityReadahead)
+ }
+}
+
func (cl *Client) configDir() string {
return filepath.Join(os.Getenv("HOME"), ".config/torrent")
}
c.pendPiece(piece, t.Pieces[piece].Priority)
}
+func (cl *Client) raisePiecePriority(t *torrent, piece int, priority piecePriority) {
+ if t.Pieces[piece].Priority < priority {
+ cl.prioritizePiece(t, piece, priority)
+ }
+}
+
func (cl *Client) prioritizePiece(t *torrent, piece int, priority piecePriority) {
if t.havePiece(piece) {
return
// TODO: Leave higher priorities as they were?
t.cl.prioritizePiece(t.torrent, i, piecePriorityNormal)
}
- t.cl.prioritizePiece(t.torrent, 0, piecePriorityHigh)
- t.cl.prioritizePiece(t.torrent, t.NumPieces()-1, piecePriorityHigh)
+ // Nice to have the first and last pieces soon for various interactive
+ // purposes.
+ t.cl.prioritizePiece(t.torrent, 0, piecePriorityReadahead)
+ t.cl.prioritizePiece(t.torrent, t.NumPieces()-1, piecePriorityReadahead)
t.cl.mu.Unlock()
}
"expvar"
"fmt"
"io"
- "log"
"net"
"sync"
"time"
return
}
key := cn.piecePriorities[piece]
- if priority == piecePriorityHigh {
- key = -key
- }
- if piece == 0 {
- log.Print(key)
+ // TODO: Have some kind of overlap here, so there's some probabilistic
+ // favouring of higher priority pieces.
+ switch priority {
+ case piecePriorityReadahead:
+ key -= len(cn.piecePriorities)
+ case piecePriorityNext:
+ key -= 2 * len(cn.piecePriorities)
+ case piecePriorityNow:
+ key -= 3 * len(cn.piecePriorities)
}
cn.pieceRequestOrder.SetPiece(piece, key)
}