]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Update requests after deleting all in some corner cases
authorMatt Joiner <anacrolix@gmail.com>
Mon, 13 Dec 2021 01:09:12 +0000 (12:09 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 13 Dec 2021 01:09:12 +0000 (12:09 +1100)
Choked by non-fast PeerConn, deleted PeerConn. They're not exactly guarded as strictly as they could be, so there's plenty of room for performance improvements here.

peerconn.go
torrent.go
webseed-peer.go

index 4ec0944ba7090f3a9ede320a3873488e0610728e..0083a0735879d6215958c7308988f5bf910cf6e8 100644 (file)
@@ -1095,7 +1095,13 @@ func (c *PeerConn) mainReadLoop() (err error) {
                                break
                        }
                        if !c.fastEnabled() {
-                               c.deleteAllRequests()
+                               if !c.deleteAllRequests().IsEmpty() {
+                                       c.t.iterPeers(func(p *Peer) {
+                                               if p.isLowOnRequests() {
+                                                       p.updateRequests("choked by non-fast PeerConn")
+                                               }
+                                       })
+                               }
                        } else {
                                // We don't decrement pending requests here, let's wait for the peer to either
                                // reject or satisfy the outstanding requests. Additionally, some peers may unchoke
@@ -1554,16 +1560,27 @@ func (c *Peer) deleteRequest(r RequestIndex) bool {
        }
        delete(c.t.pendingRequests, r)
        delete(c.t.lastRequested, r)
+       // c.t.iterPeers(func(p *Peer) {
+       //      if p.isLowOnRequests() {
+       //              p.updateRequests("Peer.deleteRequest")
+       //      }
+       // })
        return true
 }
 
-func (c *Peer) deleteAllRequests() {
-       c.requestState.Requests.Clone().Iterate(func(x uint32) bool {
+func (c *Peer) deleteAllRequests() (deleted *roaring.Bitmap) {
+       deleted = c.requestState.Requests.Clone()
+       deleted.Iterate(func(x uint32) bool {
                if !c.deleteRequest(x) {
                        panic("request should exist")
                }
                return true
        })
+       c.assertNoRequests()
+       return
+}
+
+func (c *Peer) assertNoRequests() {
        if !c.requestState.Requests.IsEmpty() {
                panic(c.requestState.Requests.GetCardinality())
        }
index c41b213b21fdc1ee304ae8a7c855b568bf9d0c75..5c8dca25d58db702d5eba5e4cb5c0b663c565d44 100644 (file)
@@ -1396,7 +1396,13 @@ func (t *Torrent) deletePeerConn(c *PeerConn) (ret bool) {
                }
        }
        torrent.Add("deleted connections", 1)
-       c.deleteAllRequests()
+       if !c.deleteAllRequests().IsEmpty() {
+               t.iterPeers(func(p *Peer) {
+                       if p.isLowOnRequests() {
+                               p.updateRequests("Torrent.deletePeerConn")
+                       }
+               })
+       }
        t.assertPendingRequests()
        return
 }
index 221aa53fe71cca0253759de957185a5021f43140..08a7be2cbc86c86cf7b131ff5240ce016ea6eed4 100644 (file)
@@ -133,6 +133,11 @@ func (ws *webseedPeer) onClose() {
        for _, r := range ws.activeRequests {
                r.Cancel()
        }
+       ws.peer.t.iterPeers(func(p *Peer) {
+               if p.isLowOnRequests() {
+                       p.updateRequests("webseedPeer.onClose")
+               }
+       })
        ws.requesterCond.Broadcast()
 }