From b51443458197dc3b56f917143991460ad410f502 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Thu, 11 Feb 2016 17:57:57 +1100 Subject: [PATCH] Trigger piece request order changes on connections in a few spots The client was requesting already obtained data in certain circumstances. This fixes it. --- client.go | 4 +++- torrent.go | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/client.go b/client.go index 663d1a01..6d86c41a 100644 --- a/client.go +++ b/client.go @@ -2497,7 +2497,9 @@ func (me *Client) pieceChanged(t *torrent, piece int) { } else { me.onFailedPiece(t, piece) } - t.updatePiecePriority(piece) + if t.updatePiecePriority(piece) { + t.piecePriorityChanged(piece) + } t.publishPieceChange(piece) } diff --git a/torrent.go b/torrent.go index 01bc9005..c8e5e5ba 100644 --- a/torrent.go +++ b/torrent.go @@ -860,6 +860,8 @@ func (t *torrent) updatePiecePriority(piece int) bool { return true } +// Update all piece priorities in one hit. This function should have the same +// output as updatePiecePriority, but across all pieces. func (t *torrent) updatePiecePriorities() { newPrios := make([]piecePriority, t.numPieces()) t.pendingPieces.IterTyped(func(piece int) (more bool) { @@ -875,8 +877,10 @@ func (t *torrent) updatePiecePriorities() { } return true }) - // TODO: Do I need a pass suppressing stuff that we already have? for i, prio := range newPrios { + if t.pieceComplete(i) { + prio = PiecePriorityNone + } if prio != t.Pieces[i].priority { t.Pieces[i].priority = prio t.piecePriorityChanged(i)