From 84a4b1be7a6eceed3b8cbc46d062b61623942bf4 Mon Sep 17 00:00:00 2001 From: Prem Chaitanya Prathi Date: Wed, 15 Oct 2025 06:37:06 +0530 Subject: [PATCH] fix: use simple protocol and pubsubTopic based selection for peerExchange (#1295) --- waku/v2/peermanager/peer_manager.go | 1 + waku/v2/peermanager/peer_selection.go | 19 +++++++++++++++++++ waku/v2/protocol/peer_exchange/client.go | 2 +- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/waku/v2/peermanager/peer_manager.go b/waku/v2/peermanager/peer_manager.go index 9aa8df57..3ee4dfa1 100644 --- a/waku/v2/peermanager/peer_manager.go +++ b/waku/v2/peermanager/peer_manager.go @@ -96,6 +96,7 @@ type PeerSelection int const ( Automatic PeerSelection = iota LowestRTT + ProtoPubSubTopicOnly //This is added to address an issue with peerExchange where on-demand discovery cannot be used. ) const maxFailedAttempts = 5 diff --git a/waku/v2/peermanager/peer_selection.go b/waku/v2/peermanager/peer_selection.go index 1fa5a90a..7cadbe22 100644 --- a/waku/v2/peermanager/peer_selection.go +++ b/waku/v2/peermanager/peer_selection.go @@ -204,6 +204,12 @@ func (pm *PeerManager) SelectPeers(criteria PeerSelectionCriteria) (peer.IDSlice } //TODO: Update this once peer Ping cache PR is merged into this code. return []peer.ID{peerID}, nil + case ProtoPubSubTopicOnly: + peers, err := pm.SelectPeersByProto(criteria.Proto, criteria.SpecificPeers, criteria.PubsubTopics) + if err != nil { + return nil, err + } + return peers, nil default: return nil, errors.New("unknown peer selection type specified") } @@ -257,3 +263,16 @@ func (pm *PeerManager) FilterPeersByProto(specificPeers peer.IDSlice, excludePee } return peers, nil } + +func (pm *PeerManager) SelectPeersByProto(protocol protocol.ID, specificPeers peer.IDSlice, pubsubTopics []string) (peer.IDSlice, error) { + var selectedPeers peer.IDSlice + selectedPeers, err := pm.FilterPeersByProto(specificPeers, nil, protocol) + if err != nil { + return nil, err + } + selectedPeers = pm.host.Peerstore().(wps.WakuPeerstore).PeersByPubSubTopics(pubsubTopics, selectedPeers...) + if len(selectedPeers) == 0 { + return nil, utils.ErrNoPeersAvailable + } + return selectedPeers, nil +} diff --git a/waku/v2/protocol/peer_exchange/client.go b/waku/v2/protocol/peer_exchange/client.go index 94d70203..f81dde54 100644 --- a/waku/v2/protocol/peer_exchange/client.go +++ b/waku/v2/protocol/peer_exchange/client.go @@ -53,7 +53,7 @@ func (wakuPX *WakuPeerExchange) Request(ctx context.Context, numPeers int, opts } selectedPeers, err := wakuPX.pm.SelectPeers( peermanager.PeerSelectionCriteria{ - SelectionType: params.peerSelectionType, + SelectionType: peermanager.ProtoPubSubTopicOnly, //Overriding selection type, this is hacky but to avoid refactor Proto: PeerExchangeID_v20alpha1, PubsubTopics: pubsubTopics, SpecificPeers: params.preferredPeers,