From 076036f5f099c591e936d9dc07f70584b7ff3d62 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Tue, 2 Apr 2024 14:02:48 +1100 Subject: [PATCH] Use Option with request piece states cache --- requesting.go | 11 +++++++---- torrent.go | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/requesting.go b/requesting.go index af609356..5d79238d 100644 --- a/requesting.go +++ b/requesting.go @@ -9,6 +9,8 @@ import ( "time" "unsafe" + g "github.com/anacrolix/generics" + "github.com/RoaringBitmap/roaring" "github.com/anacrolix/generics/heap" "github.com/anacrolix/log" @@ -78,7 +80,7 @@ type ( type desiredPeerRequests struct { requestIndexes []RequestIndex peer *Peer - pieceStates []requestStrategy.PieceRequestOrderState + pieceStates []g.Option[requestStrategy.PieceRequestOrderState] } func (p *desiredPeerRequests) lessByValue(leftRequest, rightRequest RequestIndex) bool { @@ -95,8 +97,8 @@ func (p *desiredPeerRequests) lessByValue(leftRequest, rightRequest RequestIndex !p.peer.peerAllowedFast.Contains(rightPieceIndex), ) } - leftPiece := &p.pieceStates[leftPieceIndex] - rightPiece := &p.pieceStates[rightPieceIndex] + leftPiece := p.pieceStates[leftPieceIndex].UnwrapPtr() + rightPiece := p.pieceStates[rightPieceIndex].UnwrapPtr() // Putting this first means we can steal requests from lesser-performing peers for our first few // new requests. priority := func() PiecePriority { @@ -183,6 +185,7 @@ func (p *Peer) getDesiredRequestState() (desired desiredRequestState) { pieceStates: t.requestPieceStates, requestIndexes: t.requestIndexes, } + clear(requestHeap.pieceStates) // Caller-provided allocation for roaring bitmap iteration. var it typedRoaring.Iterator[RequestIndex] requestStrategy.GetRequestablePieces( @@ -195,7 +198,7 @@ func (p *Peer) getDesiredRequestState() (desired desiredRequestState) { if !p.peerHasPiece(pieceIndex) { return } - requestHeap.pieceStates[pieceIndex] = pieceExtra + requestHeap.pieceStates[pieceIndex].Set(pieceExtra) allowedFast := p.peerAllowedFast.Contains(pieceIndex) t.iterUndirtiedRequestIndexesInPiece(&it, pieceIndex, func(r requestStrategy.RequestIndex) { if !allowedFast { diff --git a/torrent.go b/torrent.go index 2ced6bcb..dc586770 100644 --- a/torrent.go +++ b/torrent.go @@ -172,7 +172,7 @@ type Torrent struct { smartBanCache smartBanCache // Large allocations reused between request state updates. - requestPieceStates []request_strategy.PieceRequestOrderState + requestPieceStates []g.Option[request_strategy.PieceRequestOrderState] requestIndexes []RequestIndex disableTriggers bool -- 2.48.1