Add score to peers RPC call

This commit is contained in:
Tanguy 2022-01-21 15:50:03 +01:00
parent 8a7cdc61f6
commit 2dc1a8508e
No known key found for this signature in database
GPG Key ID: 7DD8EC6B6CE6C45E
4 changed files with 23 additions and 9 deletions

View File

@ -972,7 +972,7 @@ proc queryRandom*(
d.rng[].shuffle(filtered) d.rng[].shuffle(filtered)
return filtered.sortedByIt(-it[0]).mapIt(it[1]) return filtered.sortedByIt(-it[0]).mapIt(it[1])
proc trimConnections(node: Eth2Node, count: int) {.async.} = proc getPeersScores*(node: Eth2Node): OrderedTable[PeerId, int] =
# Kill `count` peers, scoring them to remove the least useful ones # Kill `count` peers, scoring them to remove the least useful ones
var scores = initOrderedTable[PeerID, int]() var scores = initOrderedTable[PeerID, int]()
@ -1004,7 +1004,7 @@ proc trimConnections(node: Eth2Node, count: int) {.async.} =
if peerCount == 0: continue if peerCount == 0: continue
for peer in node.pubsub.mesh[topic]: for peer in node.pubsub.mesh.getOrDefault(topic):
if peer.peerId notin scores: continue if peer.peerId notin scores: continue
# Divide by the number of connections # Divide by the number of connections
@ -1013,13 +1013,21 @@ proc trimConnections(node: Eth2Node, count: int) {.async.} =
connCount = node.switch.connmanager.connCount(peer.peerId) connCount = node.switch.connmanager.connCount(peer.peerId)
thisPeersScore = scorePerPeer div max(1, connCount) thisPeersScore = scorePerPeer div max(1, connCount)
scores[peer.peerId] = scores[peer.peerId] + thisPeersScore scores[peer.peerId] =
scores.getOrDefault(peer.peerId) + thisPeersScore
proc sortPerScore(a, b: (PeerID, int)): int = proc sortPerScore(a, b: (PeerID, int)): int =
system.cmp(a[1], b[1]) system.cmp(a[1], b[1])
scores.sort(sortPerScore) scores.sort(sortPerScore)
return scores
proc trimConnections(node: Eth2Node, count: int) {.async.} =
# Kill `count` peers, scoring them to remove the least useful ones
var scores = node.getPeersScores()
var toKick = count var toKick = count
for peerId in scores.keys: for peerId in scores.keys:

View File

@ -191,6 +191,7 @@ proc installNodeApiHandlers*(router: var RestRouter, node: BeaconNode) =
dres.get() dres.get()
var res: seq[RpcNodePeer] var res: seq[RpcNodePeer]
let scores = node.network.getPeersScores()
for peer in node.network.peers.values(): for peer in node.network.peers.values():
if (peer.connectionState in connectionMask) and if (peer.connectionState in connectionMask) and
(peer.direction in directionMask): (peer.direction in directionMask):
@ -200,8 +201,9 @@ proc installNodeApiHandlers*(router: var RestRouter, node: BeaconNode) =
last_seen_p2p_address: getLastSeenAddress(node, peer.peerId), last_seen_p2p_address: getLastSeenAddress(node, peer.peerId),
state: peer.connectionState.toString(), state: peer.connectionState.toString(),
direction: peer.direction.toString(), direction: peer.direction.toString(),
agent: node.network.switch.peerStore.agentBook.get(peer.peerId), # Fields `agent` and `proto` are not agent: node.network.switch.peerStore.agentBook.get(peer.peerId), # Fields `agent` and `proto`, `score`
proto: node.network.switch.peerStore.protoVersionBook.get(peer.peerId) # part of specification proto: node.network.switch.peerStore.protoVersionBook.get(peer.peerId),# are not part of specification
score: scores.getOrDefault(peer.peerId)
) )
res.add(peer) res.add(peer)
return RestApiResponse.jsonResponseWMeta(res, (count: uint64(len(res)))) return RestApiResponse.jsonResponseWMeta(res, (count: uint64(len(res))))

View File

@ -189,6 +189,7 @@ proc installNodeApiHandlers*(rpcServer: RpcServer, node: BeaconNode) {.
raise newException(CatchableError, "Incorrect direction parameter") raise newException(CatchableError, "Incorrect direction parameter")
let states = rstates.get() let states = rstates.get()
let dirs = rdirs.get() let dirs = rdirs.get()
let scores = node.network.getPeersScores()
for peer in node.network.peers.values(): for peer in node.network.peers.values():
if (peer.connectionState in states) and (peer.direction in dirs): if (peer.connectionState in states) and (peer.direction in dirs):
let resPeer = ( let resPeer = (
@ -197,8 +198,9 @@ proc installNodeApiHandlers*(rpcServer: RpcServer, node: BeaconNode) {.
last_seen_p2p_address: getLastSeenAddress(node, peer.peerId), last_seen_p2p_address: getLastSeenAddress(node, peer.peerId),
state: peer.connectionState.toString(), state: peer.connectionState.toString(),
direction: peer.direction.toString(), direction: peer.direction.toString(),
agent: node.network.switch.peerStore.agentBook.get(peer.peerId), # Fields `agent` and `proto` are not agent: node.network.switch.peerStore.agentBook.get(peer.peerId), # Fields `agent`, `proto` and `score`
proto: node.network.switch.peerStore.protoVersionBook.get(peer.peerId) # part of specification proto: node.network.switch.peerStore.protoVersionBook.get(peer.peerId),# are not part of specification
score: scores.getOrDefault(peer.peerId)
) )
res.add(resPeer) res.add(resPeer)
return res return res
@ -236,8 +238,9 @@ proc installNodeApiHandlers*(rpcServer: RpcServer, node: BeaconNode) {.
last_seen_p2p_address: getLastSeenAddress(node, peer.peerId), last_seen_p2p_address: getLastSeenAddress(node, peer.peerId),
state: peer.connectionState.toString(), state: peer.connectionState.toString(),
direction: peer.direction.toString(), direction: peer.direction.toString(),
agent: node.network.switch.peerStore.agentBook.get(peer.peerId), # Fields `agent` and `proto` are not agent: node.network.switch.peerStore.agentBook.get(peer.peerId), # Fields `agent`, `proto` and `score`
proto: node.network.switch.peerStore.protoVersionBook.get(peer.peerId) # part of specification proto: node.network.switch.peerStore.protoVersionBook.get(peer.peerId),# are not part of specification
score: -1 # Isn't available for this call
) )
rpcServer.rpc("get_v1_node_version") do () -> JsonNode: rpcServer.rpc("get_v1_node_version") do () -> JsonNode:

View File

@ -70,6 +70,7 @@ type
direction: string direction: string
agent: string # This is not part of specification agent: string # This is not part of specification
proto: string # This is not part of specification proto: string # This is not part of specification
score: int # This is not part of specification
RpcNodePeerCount* = tuple RpcNodePeerCount* = tuple
disconnected: int disconnected: int