From: Matt Joiner Date: Mon, 11 Oct 2021 04:45:55 +0000 (+1100) Subject: Optimize request updates due to conn and reader state changes X-Git-Tag: v1.34.0^2~49 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=5e8f61abb53b5743197d91ce9a864579e2bf1fdf;p=btrtrc.git Optimize request updates due to conn and reader state changes --- diff --git a/peerconn.go b/peerconn.go index 902b53cc..a387e1e6 100644 --- a/peerconn.go +++ b/peerconn.go @@ -274,7 +274,7 @@ func (cn *PeerConn) onGotInfo(info *metainfo.Info) { // receiving badly sized BITFIELD, or invalid HAVE messages. func (cn *PeerConn) setNumPieces(num pieceIndex) { cn._peerPieces.RemoveRange(bitmap.BitRange(num), bitmap.ToEnd) - cn.peerPiecesChanged("got info") + cn.peerPiecesChanged() } func eventAgeString(t time.Time) string { @@ -685,8 +685,7 @@ func iterBitmapsDistinct(skip *bitmap.Bitmap, bms ...bitmap.Bitmap) iter.Func { } } -func (cn *Peer) peerPiecesChanged(reason string) { - cn.updateRequests(reason) +func (cn *Peer) peerPiecesChanged() { cn.t.maybeDropMutuallyCompletePeer(cn) } @@ -708,7 +707,10 @@ func (cn *PeerConn) peerSentHave(piece pieceIndex) error { cn.t.incPieceAvailability(piece) } cn._peerPieces.Add(uint32(piece)) - cn.peerPiecesChanged("have") + if cn.t.wantPieceIndex(piece) { + cn.updateRequests("have") + } + cn.peerPiecesChanged() return nil } @@ -737,11 +739,14 @@ func (cn *PeerConn) peerSentBitfield(bf []bool) error { } if have { cn._peerPieces.Add(uint32(i)) + if cn.t.wantPieceIndex(i) { + cn.updateRequests("bitfield") + } } else { cn._peerPieces.Remove(uint32(i)) } } - cn.peerPiecesChanged("bitfield") + cn.peerPiecesChanged() return nil } @@ -757,7 +762,10 @@ func (cn *Peer) onPeerHasAllPieces() { } cn.peerSentHaveAll = true cn._peerPieces.Clear() - cn.peerPiecesChanged("have all") + if cn.t._pendingPieces.Len() != 0 { + cn.updateRequests("have all") + } + cn.peerPiecesChanged() } func (cn *PeerConn) onPeerSentHaveAll() error { @@ -769,7 +777,7 @@ func (cn *PeerConn) peerSentHaveNone() error { cn.t.decPeerPieceAvailability(&cn.Peer) cn._peerPieces.Clear() cn.peerSentHaveAll = false - cn.peerPiecesChanged("have none") + cn.peerPiecesChanged() return nil } diff --git a/torrent.go b/torrent.go index e099a10d..d5af3dad 100644 --- a/torrent.go +++ b/torrent.go @@ -1107,6 +1107,15 @@ func (t *Torrent) maybeNewConns() { func (t *Torrent) piecePriorityChanged(piece pieceIndex, reason string) { if t._pendingPieces.Contains(piece) { t.iterPeers(func(c *Peer) { + if c.actualRequestState.Interested { + return + } + if c.actualRequestState.Requests.GetCardinality() != 0 { + return + } + if !c.peerHasPiece(piece) { + return + } c.updateRequests(reason) }) }