From 14698bd9d972d65bc6e13e1fd319c5e6e53b2039 Mon Sep 17 00:00:00 2001 From: Sergei Tikhomirov Date: Wed, 9 Jul 2025 15:51:14 +0200 Subject: [PATCH] handle empty pre-selected peers case due to bad reputation --- waku/incentivization/reputation_manager.nim | 4 +++- waku/node/peer_manager/peer_manager.nim | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/waku/incentivization/reputation_manager.nim b/waku/incentivization/reputation_manager.nim index d9ca3b1aa..2ddb16c92 100644 --- a/waku/incentivization/reputation_manager.nim +++ b/waku/incentivization/reputation_manager.nim @@ -1,4 +1,4 @@ -import tables, std/options +import tables, std/options, chronicles import ../waku_lightpush/[rpc, common] import libp2p/peerid @@ -44,6 +44,8 @@ proc updateReputationFromResponse*( let respQuality = evaluateResponse(response) case respQuality of BadResponse: + debug "Assign bad reputation for peer", peer = peer manager.setReputation(peer, some(false)) # false => BadRep of GoodResponse: + debug "Assign good reputation for peer", peer = peer manager.setReputation(peer, some(true)) # true => GoodRep diff --git a/waku/node/peer_manager/peer_manager.nim b/waku/node/peer_manager/peer_manager.nim index 2b8ece328..e837c6d21 100644 --- a/waku/node/peer_manager/peer_manager.nim +++ b/waku/node/peer_manager/peer_manager.nim @@ -250,10 +250,15 @@ proc selectPeer*( # If not slotted, we select a random peer for the given protocol if peers.len > 0: # if reputation is enabled, filter out bad-reputation peers - debug "Total peers in peerstore:", numPeers = peers.len + debug "Before filtering - total peers:", numPeers = peers.len var preSelectedPeers = if pm.reputationManager.isSome(): debug "Reputation enabled: consider only non-negative reputation peers" + for peer in peers: + let rep = try: + pm.reputationManager.get().getReputation(peer.peerId) + except KeyError: + none(bool) peers.filterIt: let rep = try: @@ -263,10 +268,16 @@ proc selectPeer*( rep == none(bool) or rep == some(true) else: peers + + debug "Pre-selected peers from peerstore: ", numPeers = preSelectedPeers.len + if preSelectedPeers.len == 0: + return none(RemotePeerInfo) + let selectedPeer = preSelectedPeers[0] + if pm.reputationManager.isSome(): - debug "Non-negative reputation peers in peerstore: ", numPeers = preSelectedPeers.len debug "Selected peer has reputation", reputation = pm.reputationManager.get().getReputation(selectedPeer.peerId) + trace "Got peer from peerstore", peerId = selectedPeer.peerId, multi = selectedPeer.addrs[0], protocol = proto return some(selectedPeer)