From: Matt Joiner <anacrolix@gmail.com>
Date: Tue, 2 Apr 2024 03:02:48 +0000 (+1100)
Subject: Use Option with request piece states cache
X-Git-Tag: v1.56.0~25
X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=076036f5f099c591e936d9dc07f70584b7ff3d62;p=btrtrc.git

Use Option with request piece states cache
---

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