Downloading a chunk may mean the piece isn't wanted anymore

Hopefully this fixes a very rare logic error in replenishing connection requests for a piece that isn't wanted, yet is still in the connection piece request order.
This commit is contained in:
Matt Joiner 2015-07-17 21:04:43 +10:00
parent 4d3b6e5116
commit 6c04000644
1 changed files with 5 additions and 1 deletions

View File

@ -2542,11 +2542,15 @@ func (me *Client) downloadedChunk(t *torrent, c *connection, msg *pp.Message) er
// Record that we have the chunk.
piece.unpendChunkIndex(chunkIndex(req.chunkSpec, t.chunkSize))
delete(t.urgent, req)
// It's important that the piece is potentially queued before we check if
// the piece is still wanted, because if it is queued, it won't be wanted.
if piece.numPendingChunks() == 0 {
me.queuePieceCheck(t, req.Index)
}
if !t.wantPiece(int(req.Index)) {
for _, c := range t.Conns {
c.pieceRequestOrder.DeletePiece(int(req.Index))
}
me.queuePieceCheck(t, req.Index)
}
// Cancel pending requests for this chunk.