pex.go | 9 +++++++-- pexconn.go | 8 ++++++++ diff --git a/pex.go b/pex.go index 4770f3d3bbf7f1804d66f33b8c230207092d9a3c..a0a5f49f5babfb54a2ca11b532d7a017babf4bb8 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 @@ // 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 @@ defer s.Unlock() 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 2f7e7df08d110eae7c5a15d28ba4a45c43323680..9254f5e1876c15ceff293d9f37c687d004d73b5c 100644 --- a/pexconn.go +++ b/pexconn.go @@ -143,8 +143,16 @@ 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