acceptLimiter map[ipStr]int
dialRateLimiter *rate.Limiter
+ numHalfOpen int
websocketTrackers websocketTrackers
}
panic("invariant broken")
}
delete(t.halfOpen, addr)
- t.openNewConns()
+ cl.numHalfOpen--
+ for _, t := range cl.torrents {
+ t.openNewConns()
+ }
}
// Performs initiator handshakes and returns a connection. Returns nil *connection if no connection
MinDialTimeout time.Duration
EstablishedConnsPerTorrent int
HalfOpenConnsPerTorrent int
+ TotalHalfOpenConns int
// Maximum number of peer addresses in reserve.
TorrentPeersHighWater int
// Minumum number of peers before effort is made to obtain more peers.
MinDialTimeout: 3 * time.Second,
EstablishedConnsPerTorrent: 50,
HalfOpenConnsPerTorrent: 25,
+ TotalHalfOpenConns: 100,
TorrentPeersHighWater: 500,
TorrentPeersLowWater: 50,
HandshakesTimeout: 4 * time.Second,
return int(min(max(5, extraIncoming)+establishedHeadroom, int64(t.cl.config.HalfOpenConnsPerTorrent)))
}
-func (t *Torrent) openNewConns() {
+func (t *Torrent) openNewConns() (initiated int) {
defer t.updateWantPeersEvent()
for t.peers.Len() != 0 {
if !t.wantConns() {
if len(t.cl.dialers) == 0 {
return
}
+ if t.cl.numHalfOpen >= t.cl.config.TotalHalfOpenConns {
+ return
+ }
p := t.peers.PopMax()
t.initiateConn(p)
+ initiated++
}
+ return
}
func (t *Torrent) getConnPieceInclination() []int {
if peer.Id == t.cl.peerID {
return
}
-
if t.cl.badPeerAddr(peer.Addr) && !peer.Trusted {
return
}
if t.addrActive(addr.String()) {
return
}
+ t.cl.numHalfOpen++
t.halfOpen[addr.String()] = peer
go t.cl.outgoingConnection(t, addr, peer.Source, peer.Trusted)
}