]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Downloading a chunk may mean the piece isn't wanted anymore
authorMatt Joiner <anacrolix@gmail.com>
Fri, 17 Jul 2015 11:04:43 +0000 (21:04 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Fri, 17 Jul 2015 11:04:43 +0000 (21:04 +1000)
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.

client.go

index 2c4d4d42c8689d59233e80cc97bc765824d5830b..5f7f332f82ab9b099022539a4681796caf6a3a36 100644 (file)
--- a/client.go
+++ b/client.go
@@ -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.