diff --git a/.changelog/5480.bugfix.md b/.changelog/5480.bugfix.md new file mode 100644 index 00000000000..1a4294c7ae6 --- /dev/null +++ b/.changelog/5480.bugfix.md @@ -0,0 +1,5 @@ +go/p2p/peermgmt: Find peers and connect only when needed + +If we are already connected to a sufficient number of peers +for a given topic or protocol, there's no need to retrieve +additional peers from the registry or the seed node. diff --git a/go/p2p/peermgmt/peermgr.go b/go/p2p/peermgmt/peermgr.go index e79bffa2d93..6a65196cac7 100644 --- a/go/p2p/peermgmt/peermgr.go +++ b/go/p2p/peermgmt/peermgr.go @@ -366,11 +366,6 @@ func (m *PeerManager) connectPeers(ctx context.Context, registered bool) { }() } - var ( - peerCh <-chan peer.AddrInfo - limit int - ) - m.mu.Lock() defer m.mu.Unlock() @@ -379,14 +374,16 @@ func (m *PeerManager) connectPeers(ctx context.Context, registered bool) { switch registered { case true: - peerCh = m.registry.findProtocolPeers(ctx, p) - limit = d.min - connected + if limit := d.min - connected; limit > 0 { + peerCh := m.registry.findProtocolPeers(ctx, p) + connectPeers(peerCh, limit) + } default: - peerCh = m.discovery.findPeers(ctx, string(p)) - limit = d.total - connected + if limit := d.total - connected; limit > 0 { + peerCh := m.discovery.findPeers(ctx, string(p)) + connectPeers(peerCh, limit) + } } - - connectPeers(peerCh, limit) } for t, d := range m.topics { @@ -394,15 +391,17 @@ func (m *PeerManager) connectPeers(ctx context.Context, registered bool) { switch registered { case true: - peerCh = m.registry.findTopicPeers(ctx, t) - limit = d.min - connected + if limit := d.min - connected; limit > 0 { + peerCh := m.registry.findTopicPeers(ctx, t) + connectPeers(peerCh, limit) + } default: - peerCh = m.discovery.findPeers(ctx, t) - limit = d.total - connected + if limit := d.total - connected; limit > 0 { + peerCh := m.discovery.findPeers(ctx, t) + connectPeers(peerCh, limit) + } } - - connectPeers(peerCh, limit) } }