diff --git a/src/avalanche/test/processor_tests.cpp b/src/avalanche/test/processor_tests.cpp --- a/src/avalanche/test/processor_tests.cpp +++ b/src/avalanche/test/processor_tests.cpp @@ -103,7 +103,7 @@ m_node.connman = std::move(connman); m_node.peerman = ::PeerManager::make( config.GetChainParams(), *m_connman, m_node.banman.get(), - *m_node.scheduler, *m_node.chainman, *m_node.mempool, false); + *m_node.chainman, *m_node.mempool, false); m_node.chain = interfaces::MakeChain(m_node, config.GetChainParams()); // Get the processor ready. diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -2388,10 +2388,9 @@ ChainstateManager &chainman = *node.chainman; assert(!node.peerman); - node.peerman = - PeerManager::make(chainparams, *node.connman, node.banman.get(), - *node.scheduler, chainman, *node.mempool, - args.GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY)); + node.peerman = PeerManager::make( + chainparams, *node.connman, node.banman.get(), chainman, *node.mempool, + args.GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY)); RegisterValidationInterface(node.peerman.get()); // sanitize comments per BIP-0014, format user agent and check total size @@ -3159,6 +3158,10 @@ }, DUMP_BANS_INTERVAL); + if (node.peerman) { + node.peerman->StartScheduledTasks(*node.scheduler); + } + // Start Avalanche's event loop. g_avalanche->startEventLoop(*node.scheduler); diff --git a/src/net_processing.h b/src/net_processing.h --- a/src/net_processing.h +++ b/src/net_processing.h @@ -49,12 +49,16 @@ class PeerManager : public CValidationInterface, public NetEventsInterface { public: - static std::unique_ptr - make(const CChainParams &chainparams, CConnman &connman, BanMan *banman, - CScheduler &scheduler, ChainstateManager &chainman, CTxMemPool &pool, - bool ignore_incoming_txs); + static std::unique_ptr make(const CChainParams &chainparams, + CConnman &connman, BanMan *banman, + ChainstateManager &chainman, + CTxMemPool &pool, + bool ignore_incoming_txs); virtual ~PeerManager() {} + /** Begin running background tasks, should only be called once */ + virtual void StartScheduledTasks(CScheduler &scheduler) = 0; + /** Get statistics from node state */ virtual bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats) = 0; diff --git a/src/net_processing.cpp b/src/net_processing.cpp --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -464,9 +464,8 @@ class PeerManagerImpl final : public PeerManager { public: PeerManagerImpl(const CChainParams &chainparams, CConnman &connman, - BanMan *banman, CScheduler &scheduler, - ChainstateManager &chainman, CTxMemPool &pool, - bool ignore_incoming_txs); + BanMan *banman, ChainstateManager &chainman, + CTxMemPool &pool, bool ignore_incoming_txs); /** Overridden from CValidationInterface. */ void BlockConnected(const std::shared_ptr &pblock, @@ -491,6 +490,7 @@ EXCLUSIVE_LOCKS_REQUIRED(pto->cs_sendProcessing); /** Implement PeerManager */ + void StartScheduledTasks(CScheduler &scheduler) override; void CheckForStaleTipAndEvictPeers() override; bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats) override; bool IgnoresIncomingTxs() override { return m_ignore_incoming_txs; } @@ -2049,17 +2049,14 @@ std::unique_ptr PeerManager::make(const CChainParams &chainparams, CConnman &connman, - BanMan *banman, CScheduler &scheduler, - ChainstateManager &chainman, CTxMemPool &pool, + BanMan *banman, ChainstateManager &chainman, CTxMemPool &pool, bool ignore_incoming_txs) { - return std::make_unique(chainparams, connman, banman, - scheduler, chainman, pool, - ignore_incoming_txs); + return std::make_unique( + chainparams, connman, banman, chainman, pool, ignore_incoming_txs); } PeerManagerImpl::PeerManagerImpl(const CChainParams &chainparams, CConnman &connman, BanMan *banman, - CScheduler &scheduler, ChainstateManager &chainman, CTxMemPool &pool, bool ignore_incoming_txs) : m_chainparams(chainparams), m_connman(connman), m_banman(banman), @@ -2083,7 +2080,9 @@ // same probability that we have in the reject filter). m_recent_confirmed_transactions.reset( new CRollingBloomFilter(24000, 0.000001)); +} +void PeerManagerImpl::StartScheduledTasks(CScheduler &scheduler) { // Stale tip checking and peer eviction are on two different timers, but we // don't want them to get out of sync due to drift in the scheduler, so we // combine them in one function and schedule at the quicker (peer-eviction) diff --git a/src/test/denialofservice_tests.cpp b/src/test/denialofservice_tests.cpp --- a/src/test/denialofservice_tests.cpp +++ b/src/test/denialofservice_tests.cpp @@ -68,9 +68,9 @@ auto connman = std::make_unique(config, 0x1337, 0x1337); // Disable inactivity checks for this test to avoid interference static_cast(connman.get())->SetPeerConnectTimeout(99999s); - auto peerLogic = PeerManager::make( - config.GetChainParams(), *connman, nullptr, *m_node.scheduler, - *m_node.chainman, *m_node.mempool, false); + auto peerLogic = + PeerManager::make(config.GetChainParams(), *connman, nullptr, + *m_node.chainman, *m_node.mempool, false); // Mock an outbound peer CAddress addr1(ip(0xa0b0c001), NODE_NONE); @@ -154,9 +154,9 @@ const Config &config = GetConfig(); auto connman = std::make_unique(config, 0x1337, 0x1337); - auto peerLogic = PeerManager::make( - config.GetChainParams(), *connman, nullptr, *m_node.scheduler, - *m_node.chainman, *m_node.mempool, false); + auto peerLogic = + PeerManager::make(config.GetChainParams(), *connman, nullptr, + *m_node.chainman, *m_node.mempool, false); const Consensus::Params &consensusParams = config.GetChainParams().GetConsensus(); @@ -240,9 +240,9 @@ m_args.GetDataDirBase() / "banlist.dat", config.GetChainParams(), nullptr, DEFAULT_MISBEHAVING_BANTIME); auto connman = std::make_unique(config, 0x1337, 0x1337); - auto peerLogic = PeerManager::make( - config.GetChainParams(), *connman, banman.get(), *m_node.scheduler, - *m_node.chainman, *m_node.mempool, false); + auto peerLogic = + PeerManager::make(config.GetChainParams(), *connman, banman.get(), + *m_node.chainman, *m_node.mempool, false); banman->ClearBanned(); CAddress addr1(ip(0xa0b0c001), NODE_NONE); @@ -304,9 +304,9 @@ m_args.GetDataDirBase() / "banlist.dat", config.GetChainParams(), nullptr, DEFAULT_MISBEHAVING_BANTIME); auto connman = std::make_unique(config, 0x1337, 0x1337); - auto peerLogic = PeerManager::make( - config.GetChainParams(), *connman, banman.get(), *m_node.scheduler, - *m_node.chainman, *m_node.mempool, false); + auto peerLogic = + PeerManager::make(config.GetChainParams(), *connman, banman.get(), + *m_node.chainman, *m_node.mempool, false); banman->ClearBanned(); int64_t nStartTime = GetTime(); diff --git a/src/test/net_tests.cpp b/src/test/net_tests.cpp --- a/src/test/net_tests.cpp +++ b/src/test/net_tests.cpp @@ -1166,9 +1166,9 @@ const CChainParams ¶ms = GetConfig().GetChainParams(); m_node.connman = std::make_unique(); - m_node.peerman = PeerManager::make( - params, *m_node.connman, m_node.banman.get(), *m_node.scheduler, - *m_node.chainman, *m_node.mempool, false); + m_node.peerman = + PeerManager::make(params, *m_node.connman, m_node.banman.get(), + *m_node.chainman, *m_node.mempool, false); bilingual_str error; // Init the global avalanche object otherwise the avalanche outbound diff --git a/src/test/util/setup_common.cpp b/src/test/util/setup_common.cpp --- a/src/test/util/setup_common.cpp +++ b/src/test/util/setup_common.cpp @@ -236,9 +236,9 @@ DEFAULT_MISBEHAVING_BANTIME); // Deterministic randomness for tests. m_node.connman = std::make_unique(config, 0x1337, 0x1337); - m_node.peerman = PeerManager::make( - chainparams, *m_node.connman, m_node.banman.get(), *m_node.scheduler, - *m_node.chainman, *m_node.mempool, false); + m_node.peerman = + PeerManager::make(chainparams, *m_node.connman, m_node.banman.get(), + *m_node.chainman, *m_node.mempool, false); { CConnman::Options options; options.m_msgproc.push_back(m_node.peerman.get());