From: Matt Joiner Date: Wed, 24 May 2023 02:11:10 +0000 (+1000) Subject: Reintroduce torrent-wide PEX throttling X-Git-Url: http://www.git.stargrave.org/?p=btrtrc.git;a=commitdiff_plain;h=5380337f869ed630e1102036bf6dec48c044152a Reintroduce torrent-wide PEX throttling https://github.com/anacrolix/torrent/discussions/836 --- diff --git a/pex.go b/pex.go index 4770f3d3..a0a5f49f 100644 --- a/pex.go +++ b/pex.go @@ -4,6 +4,7 @@ import ( "net" "net/netip" "sync" + "time" pp "github.com/anacrolix/torrent/peer_protocol" ) @@ -144,8 +145,11 @@ func (me *pexMsgFactory) PexMsg() *pp.PexMsg { // Per-torrent PEX state type pexState struct { sync.RWMutex - tail *pexEvent // event feed list - hold []pexEvent // delayed drops + tail *pexEvent // event feed list + hold []pexEvent // delayed drops + // Torrent-wide cooldown deadline on inbound. This exists to prevent PEX from drowning out other + // peer address sources, until that is fixed. + rest time.Time nc int // net number of alive conns msg0 pexMsgFactory // initial message } @@ -157,6 +161,7 @@ func (s *pexState) Reset() { s.tail = nil s.hold = nil s.nc = 0 + s.rest = time.Time{} s.msg0 = pexMsgFactory{} } diff --git a/pexconn.go b/pexconn.go index 2f7e7df0..9254f5e1 100644 --- a/pexconn.go +++ b/pexconn.go @@ -143,9 +143,17 @@ func (s *pexConnState) Recv(payload []byte) error { var peers peerInfos peers.AppendFromPex(rx.Added6, rx.Added6Flags) peers.AppendFromPex(rx.Added, rx.AddedFlags) + if time.Now().Before(s.torrent.pex.rest) { + s.dbg.Printf("in cooldown period, incoming PEX discarded") + return nil + } added := s.torrent.addPeers(peers) s.dbg.Printf("got %v peers over pex, added %v", len(peers), added) + if len(peers) > 0 { + s.torrent.pex.rest = time.Now().Add(pexInterval) + } + // one day we may also want to: // - handle drops somehow // - detect malicious peers