// 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 {
}
}
-func (cn *Peer) peerPiecesChanged(reason string) {
- cn.updateRequests(reason)
+func (cn *Peer) peerPiecesChanged() {
cn.t.maybeDropMutuallyCompletePeer(cn)
}
cn.t.incPieceAvailability(piece)
}
cn._peerPieces.Add(uint32(piece))
- cn.peerPiecesChanged("have")
+ if cn.t.wantPieceIndex(piece) {
+ cn.updateRequests("have")
+ }
+ cn.peerPiecesChanged()
return nil
}
}
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
}
}
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 {
cn.t.decPeerPieceAvailability(&cn.Peer)
cn._peerPieces.Clear()
cn.peerSentHaveAll = false
- cn.peerPiecesChanged("have none")
+ cn.peerPiecesChanged()
return nil
}
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)
})
}