]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Add Torrent-level request cancel for consistency
authorMatt Joiner <anacrolix@gmail.com>
Fri, 10 Dec 2021 07:04:45 +0000 (18:04 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 12 Dec 2021 07:35:01 +0000 (18:35 +1100)
peerconn.go
requesting.go
torrent.go

index 4f43d50d3e444e9c61d67000947abf106e039c5a..f36da1c03f898d9cfd4176e48d0a44322783bc5d 100644 (file)
@@ -1550,8 +1550,10 @@ func (c *Peer) deleteRequest(r RequestIndex) bool {
                f(PeerRequestEvent{c, c.t.requestIndexToRequest(r)})
        }
        c.updateExpectingChunks()
-       delete(c.t.pendingRequests, r)
-       delete(c.t.lastRequested, r)
+       if c.t.requestingPeer(r) == c {
+               delete(c.t.pendingRequests, r)
+               delete(c.t.lastRequested, r)
+       }
        return true
 }
 
@@ -1694,6 +1696,10 @@ func (pc *PeerConn) isLowOnRequests() bool {
        return pc.actualRequestState.Requests.IsEmpty()
 }
 
+func (p *Peer) uncancelledRequests() uint64 {
+       return p.actualRequestState.Requests.GetCardinality() - p.cancelledRequests.GetCardinality()
+}
+
 func (pc *PeerConn) remoteIsTransmission() bool {
        return bytes.HasPrefix(pc.PeerID[:], []byte("-TR")) && pc.PeerID[7] == '-'
 }
index 50771025d88a67df603ab2da3e14bc6fe3838751..f3cd868091f22649c31f19f9819d43925b54f774 100644 (file)
@@ -211,6 +211,7 @@ func (p *Peer) applyRequestState(next desiredRequestState) bool {
        }
        more := true
        requestHeap := &next.Requests
+       t := p.t
        heap.Init(requestHeap)
        for requestHeap.Len() != 0 && maxRequests(current.Requests.GetCardinality()) < p.nominalMaxRequests() {
                req := heap.Pop(requestHeap).(RequestIndex)
@@ -219,9 +220,9 @@ func (p *Peer) applyRequestState(next desiredRequestState) bool {
                        // requests, so we can skip this one with no additional consideration.
                        continue
                }
-               existing := p.t.pendingRequests[req]
-               if existing != nil && existing != p && existing.actualRequestState.Requests.GetCardinality()-existing.cancelledRequests.GetCardinality() > current.Requests.GetCardinality() {
-                       existing.cancel(req)
+               existing := t.requestingPeer(req)
+               if existing != nil && existing != p && existing.uncancelledRequests() > current.Requests.GetCardinality() {
+                       t.cancelRequest(req)
                }
                more = p.mustRequest(req)
                if !more {
index b2688994cc4a5ba9d88f2b2cc77deed6f341cf97..db24603bcaa8fb7dae9dd236f80f5e2b93efb6b6 100644 (file)
@@ -2310,3 +2310,16 @@ func (t *Torrent) pieceRequestIndexOffset(piece pieceIndex) RequestIndex {
 func (t *Torrent) updateComplete() {
        t.Complete.SetBool(t.haveAllPieces())
 }
+
+func (t *Torrent) cancelRequest(r RequestIndex) *Peer {
+       p := t.pendingRequests[r]
+       if p != nil {
+               p.cancel(r)
+       }
+       delete(t.pendingRequests, r)
+       return p
+}
+
+func (t *Torrent) requestingPeer(r RequestIndex) *Peer {
+       return t.pendingRequests[r]
+}