"io"
"net"
"strings"
- "sync/atomic"
"time"
"github.com/RoaringBitmap/roaring"
peerTouchedPieces map[pieceIndex]struct{}
peerAllowedFast typedRoaring.Bitmap[pieceIndex]
- PeerMaxRequests maxRequests // Maximum pending requests the peer allows.
- PeerExtensionIDs map[pp.ExtensionName]pp.ExtensionNumber
- PeerClientName atomic.Value
+ PeerMaxRequests maxRequests // Maximum pending requests the peer allows.
logger log.Logger
}
return cn.t.cl.locker()
}
-func (cn *Peer) supportsExtension(ext pp.ExtensionName) bool {
+func (cn *PeerConn) supportsExtension(ext pp.ExtensionName) bool {
_, ok := cn.PeerExtensionIDs[ext]
return ok
}
if p.updateRequestsTimer != nil {
p.updateRequestsTimer.Stop()
}
+ for _, prs := range p.peerRequests {
+ prs.allocReservation.Drop()
+ }
p.peerImpl.onClose()
if p.t != nil {
p.t.decPeerPieceAvailability(p)
}
}
-func (cn *Peer) peerPiecesChanged() {
- cn.t.maybeDropMutuallyCompletePeer(cn)
-}
-
// After handshake, we know what Torrent and Client stats to include for a
// connection.
func (cn *Peer) postHandshakeStats(f func(*ConnStats)) {
t := cn.t
f(&t.stats)
- f(&t.cl.stats)
+ f(&t.cl.connStats)
}
// All ConnStats that include this connection. Some objects are not known
cn.allStats(add(n, func(cs *ConnStats) *Count { return &cs.BytesRead }))
}
-// Returns whether the connection could be useful to us. We're seeding and
-// they want data, we don't have metainfo and they can provide it, etc.
-func (c *Peer) useful() bool {
- t := c.t
- if c.closed.IsSet() {
- return false
- }
- if !t.haveInfo() {
- return c.supportsExtension("ut_metadata")
- }
- if t.seeding() && c.peerInterested {
- return true
- }
- if c.peerHasWantedPieces() {
- return true
- }
- return false
-}
-
func (c *Peer) lastHelpful() (ret time.Time) {
ret = c.lastUsefulChunkReceived
if c.t.seeding() && c.lastChunkSent.After(ret) {