diff --git a/src/avalanche/peermanager.h b/src/avalanche/peermanager.h --- a/src/avalanche/peermanager.h +++ b/src/avalanche/peermanager.h @@ -226,8 +226,6 @@ uint32_t connectedPeersScore = 0; public: - PeerManager(CScheduler &scheduler); - /** * Node API. */ @@ -321,6 +319,8 @@ return getProof(proofid) != nullptr; } + void cleanupDanglingProofs(); + template bool forPeer(const ProofId &proofid, Callable &&func) const { auto &pview = peers.get(); @@ -403,8 +403,6 @@ bool addNodeToPeer(const PeerSet::iterator &it); bool removeNodeFromPeer(const PeerSet::iterator &it, uint32_t count = 1); - void cleanupDanglingProofs(); - friend struct ::avalanche::TestPeerManager; }; diff --git a/src/avalanche/peermanager.cpp b/src/avalanche/peermanager.cpp --- a/src/avalanche/peermanager.cpp +++ b/src/avalanche/peermanager.cpp @@ -15,15 +15,6 @@ #include namespace avalanche { -PeerManager::PeerManager(CScheduler &scheduler) { - scheduler.scheduleEvery( - [this]() -> bool { - this->cleanupDanglingProofs(); - return true; - }, - 5min); -} - bool PeerManager::addNode(NodeId nodeid, const ProofId &proofid) { auto &pview = peers.get(); auto it = pview.find(proofid); @@ -413,6 +404,24 @@ return true; } +void PeerManager::cleanupDanglingProofs() { + const auto now = GetTime(); + + std::vector danglingProofIds; + for (const Peer &peer : peers) { + // If the peer has been registered for some time and has no node + // attached, discard it. + if (peer.node_count == 0 && + (peer.registration_time + Peer::DANGLING_TIMEOUT) <= now) { + danglingProofIds.push_back(peer.getProofId()); + } + } + + for (const ProofId &proofid : danglingProofIds) { + rejectProof(proofid, RejectionMode::INVALIDATE); + } +} + NodeId PeerManager::selectNode() { for (int retry = 0; retry < SELECT_NODE_MAX_RETRY; retry++) { const PeerId p = selectPeer(); @@ -790,22 +799,4 @@ m_unbroadcast_proofids.erase(proofid); } -void PeerManager::cleanupDanglingProofs() { - const auto now = GetTime(); - - std::vector danglingProofIds; - for (const Peer &peer : peers) { - // If the peer has been registered for some time and has no node - // attached, discard it. - if (peer.node_count == 0 && - (peer.registration_time + Peer::DANGLING_TIMEOUT) <= now) { - danglingProofIds.push_back(peer.getProofId()); - } - } - - for (const ProofId &proofid : danglingProofIds) { - rejectProof(proofid, RejectionMode::INVALIDATE); - } -} - } // namespace avalanche diff --git a/src/avalanche/processor.cpp b/src/avalanche/processor.cpp --- a/src/avalanche/processor.cpp +++ b/src/avalanche/processor.cpp @@ -137,7 +137,7 @@ : connman(connmanIn), queryTimeoutDuration(argsman.GetArg( "-avatimeout", AVALANCHE_DEFAULT_QUERY_TIMEOUT.count())), - round(0), peerManager(std::make_unique(scheduler)), + round(0), peerManager(std::make_unique()), peerData(std::move(peerDataIn)), sessionKey(std::move(sessionKeyIn)), minQuorumScore(minQuorumTotalScoreIn), minQuorumConnectedScoreRatio(minQuorumConnectedScoreRatioIn), @@ -147,6 +147,13 @@ // Make sure we get notified of chain state changes. chainNotificationsHandler = chain.handleNotifications(std::make_shared(this)); + + scheduler.scheduleEvery( + [this]() -> bool { + WITH_LOCK(cs_peerManager, peerManager->cleanupDanglingProofs()); + return true; + }, + 5min); } Processor::~Processor() { 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 @@ -291,7 +291,7 @@ BOOST_AUTO_TEST_CASE(peer_probabilities) { // No peers. - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; BOOST_CHECK_EQUAL(pm.selectNode(), NO_NODE); const NodeId node0 = 42, node1 = 69, node2 = 37; @@ -327,7 +327,7 @@ BOOST_AUTO_TEST_CASE(remove_peer) { // No peers. - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; BOOST_CHECK_EQUAL(pm.selectPeer(), NO_PEER); // Add 4 peers. @@ -402,7 +402,7 @@ } BOOST_AUTO_TEST_CASE(compact_slots) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; // Add 4 peers. std::array peerids; @@ -431,7 +431,7 @@ } BOOST_AUTO_TEST_CASE(node_crud) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; // Create one peer. auto proof = buildRandomProof(10000000 * MIN_VALID_PROOF_SCORE); @@ -491,7 +491,7 @@ } BOOST_AUTO_TEST_CASE(node_binding) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; auto proof = buildRandomProof(MIN_VALID_PROOF_SCORE); const ProofId &proofid = proof->getId(); @@ -591,7 +591,7 @@ BOOST_AUTO_TEST_CASE(node_binding_reorg) { gArgs.ForceSetArg("-avaproofstakeutxoconfirmations", "2"); - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; auto proof = buildRandomProof(MIN_VALID_PROOF_SCORE, 99); const ProofId &proofid = proof->getId(); @@ -664,7 +664,7 @@ addCoin({txid2, i}, key); } - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; CKey masterKey = CKey::MakeCompressedKey(); const auto getPeerId = [&](const std::vector &outpoints) { return TestPeerManager::registerAndGetPeerId( @@ -718,7 +718,7 @@ BOOST_AUTO_TEST_CASE(orphan_proofs) { gArgs.ForceSetArg("-avaproofstakeutxoconfirmations", "2"); - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; auto key = CKey::MakeCompressedKey(); int immatureHeight = 100; @@ -794,7 +794,7 @@ } BOOST_AUTO_TEST_CASE(dangling_node) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; auto proof = buildRandomProof(MIN_VALID_PROOF_SCORE); PeerId peerid = TestPeerManager::registerAndGetPeerId(pm, proof); @@ -839,7 +839,7 @@ } BOOST_AUTO_TEST_CASE(proof_accessors) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; constexpr int numProofs = 10; @@ -883,7 +883,7 @@ } BOOST_FIXTURE_TEST_CASE(conflicting_proof_rescan, NoCoolDownFixture) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; const CKey key = CKey::MakeCompressedKey(); @@ -938,7 +938,7 @@ BOOST_CHECK_EQUAL(comparator(candidate, reference), expectAccepted); BOOST_CHECK_EQUAL(comparator(reference, candidate), !expectAccepted); - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; BOOST_CHECK(pm.registerProof(reference)); BOOST_CHECK(pm.isBoundToPeer(reference->getId())); @@ -1009,7 +1009,7 @@ BOOST_AUTO_TEST_CASE(conflicting_orphans) { gArgs.ForceSetArg("-avaproofstakeutxoconfirmations", "2"); - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; const CKey key = CKey::MakeCompressedKey(); @@ -1051,7 +1051,7 @@ } BOOST_FIXTURE_TEST_CASE(preferred_conflicting_proof, NoCoolDownFixture) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; const CKey key = CKey::MakeCompressedKey(); const COutPoint conflictingOutpoint = createUtxo(key); @@ -1082,7 +1082,7 @@ } BOOST_FIXTURE_TEST_CASE(update_next_conflict_time, NoCoolDownFixture) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; auto now = GetTime(); SetMockTime(now.count()); @@ -1115,7 +1115,7 @@ } BOOST_FIXTURE_TEST_CASE(register_force_accept, NoCoolDownFixture) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; const CKey key = CKey::MakeCompressedKey(); @@ -1179,7 +1179,7 @@ } BOOST_FIXTURE_TEST_CASE(evicted_proof, NoCoolDownFixture) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; const CKey key = CKey::MakeCompressedKey(); @@ -1209,7 +1209,7 @@ } BOOST_AUTO_TEST_CASE(conflicting_proof_cooldown) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; const CKey key = CKey::MakeCompressedKey(); @@ -1278,7 +1278,7 @@ BOOST_FIXTURE_TEST_CASE(reject_proof, NoCoolDownFixture) { gArgs.ForceSetArg("-avaproofstakeutxoconfirmations", "2"); - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; const CKey key = CKey::MakeCompressedKey(); @@ -1356,7 +1356,7 @@ } BOOST_AUTO_TEST_CASE(should_request_more_nodes) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; auto proof = buildRandomProof(MIN_VALID_PROOF_SCORE); BOOST_CHECK(pm.registerProof(proof)); @@ -1404,7 +1404,7 @@ } BOOST_AUTO_TEST_CASE(score_ordering) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; std::vector expectedScores(10); // Expect the peers to be ordered by descending score @@ -1430,7 +1430,7 @@ BOOST_FIXTURE_TEST_CASE(known_score_tracking, NoCoolDownFixture) { gArgs.ForceSetArg("-avaproofstakeutxoconfirmations", "2"); - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; const CKey key = CKey::MakeCompressedKey(); @@ -1540,7 +1540,7 @@ } BOOST_AUTO_TEST_CASE(connected_score_tracking) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; const auto checkScores = [&pm](uint32_t known, uint32_t connected) { BOOST_CHECK_EQUAL(pm.getTotalPeersScore(), known); @@ -1628,7 +1628,7 @@ } BOOST_FIXTURE_TEST_CASE(proof_radix_tree, NoCoolDownFixture) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; gArgs.ForceSetArg("-enableavalancheproofreplacement", "1"); @@ -1744,7 +1744,7 @@ } BOOST_AUTO_TEST_CASE(received_avaproofs) { - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; auto addNode = [&](NodeId nodeid) { auto proof = buildRandomProof(MIN_VALID_PROOF_SCORE); @@ -1767,7 +1767,7 @@ BOOST_FIXTURE_TEST_CASE(cleanup_dangling_proof, NoCoolDownFixture) { gArgs.ForceSetArg("-enableavalancheproofreplacement", "1"); - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; const auto now = GetTime(); auto mocktime = now; diff --git a/src/avalanche/test/proofpool_tests.cpp b/src/avalanche/test/proofpool_tests.cpp --- a/src/avalanche/test/proofpool_tests.cpp +++ b/src/avalanche/test/proofpool_tests.cpp @@ -77,7 +77,7 @@ BOOST_AUTO_TEST_CASE(rescan) { gArgs.ForceSetArg("-avaproofstakeutxoconfirmations", "1"); ProofPool testPool; - avalanche::PeerManager pm(*m_node.scheduler); + avalanche::PeerManager pm; testPool.rescan(pm); BOOST_CHECK_EQUAL(testPool.size(), 0);