request-strategy/order.go | 15 +++++++++++---- diff --git a/request-strategy/order.go b/request-strategy/order.go index c16cb3ea9c533244f8f5080ec6761187c83432cf..56002594f9a03c9a6069b1b7bb813a1436356d8a 100644 --- a/request-strategy/order.go +++ b/request-strategy/order.go @@ -187,11 +187,18 @@ } preallocated := make(map[ChunkSpec]*peersForPieceRequests, p.NumPendingChunks) p.iterPendingChunksWrapper(func(spec ChunkSpec) { req := Request{pp.Integer(p.index), spec} - for _, p := range peersForPiece { - if h := p.HasExistingRequest; h != nil && h(req) { - preallocated[spec] = p - p.addNextRequest(req) + for _, peer := range peersForPiece { + if h := peer.HasExistingRequest; h == nil || !h(req) { + continue + } + if !peer.canFitRequest() { + continue + } + if !peer.canRequestPiece(p.index) { + continue } + preallocated[spec] = peer + peer.addNextRequest(req) } }) pendingChunksRemaining := int(p.NumPendingChunks)