diff --git a/src/avalanche/peermanager.h b/src/avalanche/peermanager.h --- a/src/avalanche/peermanager.h +++ b/src/avalanche/peermanager.h @@ -126,14 +126,16 @@ public: /** - * Peer API. + * Provide the peer associated with the given proof. If the peer does not + * exists, then it is created. */ - // Provide the peer associated toa proof. If the peer does not exists, then - // it is created. PeerId getPeer(const Proof &proof); + /** + * Remove an existing peer. + * This is not meant for public consumption. + */ bool removePeer(const PeerId peerid); - bool rescorePeer(const PeerId peerid, uint32_t score); /** * Node API. @@ -141,12 +143,11 @@ bool addNode(NodeId nodeid, const Proof &proof, const CPubKey &pubkey); bool removeNode(NodeId nodeid); - bool forNode(NodeId nodeid, std::function func) const; + NodeId selectNode(); + bool forNode(NodeId nodeid, std::function func) const; bool updateNextRequestTime(NodeId nodeid, TimePoint timeout); - NodeId selectNode(); - /** * Exposed for tests. */ diff --git a/src/avalanche/peermanager.cpp b/src/avalanche/peermanager.cpp --- a/src/avalanche/peermanager.cpp +++ b/src/avalanche/peermanager.cpp @@ -58,49 +58,6 @@ return true; } -bool PeerManager::rescorePeer(const PeerId peerid, uint32_t score) { - auto it = peers.find(peerid); - if (it == peers.end()) { - return false; - } - - // Update the peer's score. - peers.modify(it, [&](Peer &p) { p.score = score; }); - - const size_t i = it->index; - assert(i < slots.size()); - - // Update the slot allocation to reflect the new score. - const uint64_t start = slots[i].getStart(); - - // If this is the last element, we can extend/shrink easily. - if (i + 1 == slots.size()) { - slots[i] = slots[i].withScore(score); - slotCount = slots[i].getStop(); - return true; - } - - const uint64_t stop = start + score; - const uint64_t nextStart = slots[i + 1].getStart(); - - // We can extend in place. - if (stop <= nextStart) { - fragmentation += (slots[i].getStop() - stop); - slots[i] = slots[i].withScore(score); - return true; - } - - // So we need to insert a new entry. - fragmentation += slots[i].getScore(); - slots[i] = slots[i].withPeerId(NO_PEER); - peers.modify(it, [this](Peer &p) { p.index = uint32_t(slots.size()); }); - const uint64_t newStart = slotCount; - slots.emplace_back(newStart, score, peerid); - slotCount = newStart + score; - - return true; -} - bool PeerManager::addNode(NodeId nodeid, const Proof &proof, const CPubKey &pubkey) { const PeerId peerid = getPeer(proof); diff --git a/src/avalanche/test/peermanager_tests.cpp b/src/avalanche/test/peermanager_tests.cpp --- a/src/avalanche/test/peermanager_tests.cpp +++ b/src/avalanche/test/peermanager_tests.cpp @@ -258,76 +258,6 @@ BOOST_CHECK(!pm.removePeer(NO_PEER)); } -BOOST_AUTO_TEST_CASE(rescore_peer, *boost::unit_test::timeout(5)) { - // No peers. - PeerManager pm; - BOOST_CHECK_EQUAL(pm.selectPeer(), NO_PEER); - - // Add 4 peers. - std::array peerids; - for (int i = 0; i < 4; i++) { - peerids[i] = pm.getPeer(Proof(100)); - } - - BOOST_CHECK_EQUAL(pm.getSlotCount(), 400); - BOOST_CHECK_EQUAL(pm.getFragmentation(), 0); - - for (int i = 0; i < 100; i++) { - PeerId p = pm.selectPeer(); - BOOST_CHECK(p == peerids[0] || p == peerids[1] || p == peerids[2] || - p == peerids[3]); - } - - // Set one peer's score to 0, it nevers show up now. - BOOST_CHECK(pm.rescorePeer(peerids[1], 0)); - BOOST_CHECK_EQUAL(pm.getSlotCount(), 400); - BOOST_CHECK_EQUAL(pm.getFragmentation(), 100); - - for (int i = 0; i < 100; i++) { - PeerId p = pm.selectPeer(); - BOOST_CHECK(p == peerids[0] || p == peerids[2] || p == peerids[3] || - p == NO_PEER); - } - - // "resurrect" the peer. - BOOST_CHECK(pm.rescorePeer(peerids[1], 100)); - BOOST_CHECK_EQUAL(pm.getSlotCount(), 400); - BOOST_CHECK_EQUAL(pm.getFragmentation(), 0); - - while (true) { - PeerId p = pm.selectPeer(); - BOOST_CHECK(p == peerids[0] || p == peerids[1] || p == peerids[2] || - p == peerids[3]); - // Make sure peer 1 reappeared. - if (p == peerids[1]) { - break; - } - } - - // Grow the peer to a point where it needs to be reallocated. - BOOST_CHECK(pm.rescorePeer(peerids[1], 200)); - BOOST_CHECK_EQUAL(pm.getSlotCount(), 600); - BOOST_CHECK_EQUAL(pm.getFragmentation(), 100); - - for (int i = 0; i < 25; i++) { - while (true) { - PeerId p = pm.selectPeer(); - BOOST_CHECK(p == peerids[0] || p == peerids[1] || p == peerids[2] || - p == peerids[3] || p == NO_PEER); - // Make sure peer 1 reappeared. - if (p == peerids[1]) { - break; - } - } - } - - // Compact the peer manager. - BOOST_CHECK_EQUAL(pm.compact(), 100); - BOOST_CHECK(pm.verify()); - BOOST_CHECK_EQUAL(pm.getSlotCount(), 500); - BOOST_CHECK_EQUAL(pm.getFragmentation(), 0); -} - BOOST_AUTO_TEST_CASE(compact_slots) { PeerManager pm; @@ -360,7 +290,6 @@ // Create one peer. Proof proof(100); - PeerId peerid = pm.getPeer(proof); BOOST_CHECK_EQUAL(pm.selectNode(), NO_NODE); // Add 4 nodes. @@ -398,7 +327,6 @@ // Move a node from a peer to another. Proof altproof(0); - PeerId altpeer = pm.getPeer(altproof); BOOST_CHECK(pm.addNode(3, altproof, CPubKey())); for (int i = 0; i < 100; i++) { @@ -407,18 +335,6 @@ BOOST_CHECK( pm.updateNextRequestTime(n, std::chrono::steady_clock::now())); } - - // Rescore peers and cheks node selection is affected as expected. - BOOST_CHECK(pm.rescorePeer(peerid, 0)); - BOOST_CHECK(pm.rescorePeer(altpeer, 100)); - BOOST_CHECK_EQUAL(pm.compact(), 100); - - for (int i = 0; i < 100; i++) { - NodeId n = pm.selectNode(); - BOOST_CHECK(n == 3); - BOOST_CHECK( - pm.updateNextRequestTime(n, std::chrono::steady_clock::now())); - } } BOOST_AUTO_TEST_SUITE_END()