diff --git a/src/avalanche/processor.cpp b/src/avalanche/processor.cpp --- a/src/avalanche/processor.cpp +++ b/src/avalanche/processor.cpp @@ -684,19 +684,18 @@ * never add the request to queries, which ensures bad nodes get cleaned * up over time. */ - bool hasSent = connman->ForNode(nodeid, [this, &invs](CNode *pnode) { + TimePoint timeout; + bool hasSent = connman->ForNode(nodeid, [this, &invs, + &timeout](CNode *pnode) { uint64_t current_round = round++; { // Compute the time at which this requests times out. - auto timeout = + timeout = std::chrono::steady_clock::now() + queryTimeoutDuration; // Register the query. queries.getWriteView()->insert( {pnode->GetId(), current_round, timeout, invs}); - // Set the timeout. - LOCK(cs_peerManager); - peerManager->updateNextRequestTime(pnode->GetId(), timeout); } if (pnode->m_avalanche_state) { @@ -713,6 +712,9 @@ // Success! if (hasSent) { + // Set the timeout. + LOCK(cs_peerManager); + peerManager->updateNextRequestTime(nodeid, timeout); return; } diff --git a/src/rpc/avalanche.cpp b/src/rpc/avalanche.cpp --- a/src/rpc/avalanche.cpp +++ b/src/rpc/avalanche.cpp @@ -475,13 +475,22 @@ "The avalanche proof used by this peer"}, {RPCResult::Type::NUM, "nodecount", "The number of nodes for this peer"}, - {RPCResult::Type::ARR, - "nodes", - "", - { - {RPCResult::Type::NUM, "nodeid", - "Node id, as returned by getpeerinfo"}, - }}, + { + RPCResult::Type::ARR, + "nodes", + "", + {{ + RPCResult::Type::OBJ, + "", + "", + {{ + {RPCResult::Type::NUM, "nodeid", + "Node id, as returned by getpeerinfo"}, + {RPCResult::Type::NUM, "activityScore", + "Activity score of this node"}, + }}, + }}, + }, }}, }}, }, @@ -496,6 +505,8 @@ UniValue ret(UniValue::VARR); + NodeContext &nodeContext = EnsureNodeContext(request.context); + g_avalanche->withPeerManager([&](const avalanche::PeerManager &pm) { pm.forEachPeer([&](const avalanche::Peer &peer) { UniValue obj(UniValue::VOBJ); @@ -508,7 +519,19 @@ UniValue nodes(UniValue::VARR); pm.forEachNode(peer, [&](const avalanche::Node &n) { - nodes.push_back(n.nodeid); + UniValue node(UniValue::VOBJ); + node.pushKV("nodeid", n.nodeid); + + nodeContext.connman->ForNode(n.nodeid, [&](CNode *pnode) { + if (pnode->m_avalanche_state) { + node.pushKV("availabilityScore", + pnode->m_avalanche_state->statistics + .getAvailabilityScore()); + } + return true; + }); + + nodes.push_back(node); }); obj.pushKV("nodecount", uint64_t(peer.node_count)); diff --git a/test/functional/abc_rpc_getavalanchepeerinfo.py b/test/functional/abc_rpc_getavalanchepeerinfo.py --- a/test/functional/abc_rpc_getavalanchepeerinfo.py +++ b/test/functional/abc_rpc_getavalanchepeerinfo.py @@ -9,7 +9,7 @@ ) from test_framework.key import ECKey from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import assert_equal +from test_framework.util import assert_equal, assert_greater_than_or_equal class GetAvalanchePeerInfoTest(BitcoinTestFramework): @@ -63,7 +63,10 @@ assert_equal(peer["peerid"], i) assert_equal(peer["proof"], proofs[i]) assert_equal(peer["nodecount"], nodecount) - assert_equal(set(peer["nodes"]), set([n.nodeid for n in nodes[i]])) + assert_equal(set([n["nodeid"] for n in peer["nodes"]]), set( + [n.nodeid for n in nodes[i]])) + [assert_greater_than_or_equal( + n["availabilityScore"], 0.0) for n in peer["nodes"]] if __name__ == '__main__':