The calculation of whether we should ignore a piece in
GetRequestablePieces ends up doing an allocation for every piece, when
all we really need to do is query the index in the torrent. Provide an
IgnorePiece function instead, which avoids the need for a temporary
allocation.
Observed to cut out 40% of object allocations in some workloads (large
download, lots of seeds).
t *Torrent
}
-func (r requestStrategyTorrent) Piece(i int) request_strategy.Piece {
- return requestStrategyPiece{r.t, i}
+func (r requestStrategyTorrent) IgnorePiece(i int) bool {
+ if r.t.ignorePieceForRequests(i) {
+ return true
+ }
+ if r.t.pieceNumPendingChunks(i) == 0 {
+ return true
+ }
+
+ return false
}
func (r requestStrategyTorrent) ChunksPerPiece() uint32 {
pro.tree.Scan(func(_i pieceRequestOrderItem) bool {
ih := _i.key.InfoHash
var t Torrent = input.Torrent(ih)
- var piece Piece = t.Piece(_i.key.Index)
pieceLength := t.PieceLength()
if storageLeft != nil {
if *storageLeft < pieceLength {
}
*storageLeft -= pieceLength
}
- if !piece.Request() || piece.NumPendingChunks() == 0 {
+ if t.IgnorePiece(_i.key.Index) {
// TODO: Clarify exactly what is verified. Stuff that's being hashed should be
// considered unverified and hold up further requests.
return true
package request_strategy
type Torrent interface {
- Piece(int) Piece
+ IgnorePiece(int) bool
ChunksPerPiece() uint32
PieceLength() int64
}