type desiredPeerRequests struct {
requestIndexes []RequestIndex
peer *Peer
- pieceStates map[pieceIndex]request_strategy.PieceRequestOrderState
+ pieceStates []request_strategy.PieceRequestOrderState
}
func (p *desiredPeerRequests) Len() int {
!p.peer.peerAllowedFast.Contains(rightPieceIndex),
)
}
- leftPiece := p.pieceStates[leftPieceIndex]
- rightPiece := p.pieceStates[rightPieceIndex]
+ leftPiece := &p.pieceStates[leftPieceIndex]
+ rightPiece := &p.pieceStates[rightPieceIndex]
// Putting this first means we can steal requests from lesser-performing peers for our first few
// new requests.
priority := func() piecePriority {
}
input := t.getRequestStrategyInput()
requestHeap := desiredPeerRequests{
- peer: p,
- pieceStates: make(map[pieceIndex]request_strategy.PieceRequestOrderState),
+ peer: p,
+ pieceStates: t.requestPieceStates,
+ requestIndexes: t.requestIndexes,
}
request_strategy.GetRequestablePieces(
input,
if !p.peerHasPiece(pieceIndex) {
return
}
+ requestHeap.pieceStates[pieceIndex] = pieceExtra
allowedFast := p.peerAllowedFast.Contains(pieceIndex)
p.t.piece(pieceIndex).undirtiedChunksIter.Iter(func(ci request_strategy.ChunkIndex) {
r := p.t.pieceRequestIndexOffset(pieceIndex) + ci
return
}
requestHeap.requestIndexes = append(requestHeap.requestIndexes, r)
- requestHeap.pieceStates[pieceIndex] = pieceExtra
})
},
)
func(_ context.Context) {
next := p.getDesiredRequestState()
p.applyRequestState(next)
+ p.t.requestIndexes = next.Requests.requestIndexes[:0]
},
)
}
sourcesLogger log.Logger
smartBanCache smartBanCache
+
+ // Large allocations reused between request state updates.
+ requestPieceStates []request_strategy.PieceRequestOrderState
+ requestIndexes []RequestIndex
}
func (t *Torrent) selectivePieceAvailabilityFromPeers(i pieceIndex) (count int) {
func (t *Torrent) onSetInfo() {
t.initPieceRequestOrder()
MakeSliceWithLength(&t.requestState, t.numChunks())
+ MakeSliceWithLength(&t.requestPieceStates, t.numPieces())
for i := range t.pieces {
p := &t.pieces[i]
// Need to add relativeAvailability before updating piece completion, as that may result in conns