Skip to content

Commit 7c8b6e5

Browse files
committed
[lib] add scheduler to node context
- also update test setup & access point in denial of service test
1 parent 930d837 commit 7c8b6e5

File tree

6 files changed

+24
-16
lines changed

6 files changed

+24
-16
lines changed

src/init.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,6 @@ NODISCARD static bool CreatePidFile()
157157
static std::unique_ptr<ECCVerifyHandle> globalVerifyHandle;
158158

159159
static boost::thread_group threadGroup;
160-
static CScheduler scheduler;
161160

162161
void Interrupt(NodeContext& node)
163162
{
@@ -295,6 +294,7 @@ void Shutdown(NodeContext& node)
295294
globalVerifyHandle.reset();
296295
ECC_Stop();
297296
if (node.mempool) node.mempool = nullptr;
297+
node.scheduler.reset();
298298
LogPrintf("%s: done\n", __func__);
299299
}
300300

@@ -1265,16 +1265,19 @@ bool AppInitMain(NodeContext& node)
12651265
}
12661266
}
12671267

1268+
assert(!node.scheduler);
1269+
node.scheduler = MakeUnique<CScheduler>();
1270+
12681271
// Start the lightweight task scheduler thread
1269-
CScheduler::Function serviceLoop = std::bind(&CScheduler::serviceQueue, &scheduler);
1272+
CScheduler::Function serviceLoop = [&node]{ node.scheduler->serviceQueue(); };
12701273
threadGroup.create_thread(std::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
12711274

12721275
// Gather some entropy once per minute.
1273-
scheduler.scheduleEvery([]{
1276+
node.scheduler->scheduleEvery([]{
12741277
RandAddPeriodic();
12751278
}, 60000);
12761279

1277-
GetMainSignals().RegisterBackgroundSignalScheduler(scheduler);
1280+
GetMainSignals().RegisterBackgroundSignalScheduler(*node.scheduler);
12781281

12791282
// Create client interfaces for wallets that are supposed to be loaded
12801283
// according to -wallet and -disablewallet options. This only constructs
@@ -1324,7 +1327,7 @@ bool AppInitMain(NodeContext& node)
13241327
assert(!node.connman);
13251328
node.connman = std::unique_ptr<CConnman>(new CConnman(GetRand(std::numeric_limits<uint64_t>::max()), GetRand(std::numeric_limits<uint64_t>::max())));
13261329

1327-
node.peer_logic.reset(new PeerLogicValidation(node.connman.get(), node.banman.get(), scheduler));
1330+
node.peer_logic.reset(new PeerLogicValidation(node.connman.get(), node.banman.get(), *node.scheduler));
13281331
RegisterValidationInterface(node.peer_logic.get());
13291332

13301333
// sanitize comments per BIP-0014, format user agent and check total size
@@ -1816,7 +1819,7 @@ bool AppInitMain(NodeContext& node)
18161819
connOptions.m_specified_outgoing = connect;
18171820
}
18181821
}
1819-
if (!node.connman->Start(scheduler, connOptions)) {
1822+
if (!node.connman->Start(*node.scheduler, connOptions)) {
18201823
return false;
18211824
}
18221825

@@ -1845,11 +1848,11 @@ bool AppInitMain(NodeContext& node)
18451848
uiInterface.InitMessage(_("Done loading").translated);
18461849

18471850
for (const auto& client : node.chain_clients) {
1848-
client->start(scheduler);
1851+
client->start(*node.scheduler);
18491852
}
18501853

18511854
BanMan* banman = node.banman.get();
1852-
scheduler.scheduleEvery([banman]{
1855+
node.scheduler->scheduleEvery([banman]{
18531856
banman->DumpBanlist();
18541857
}, DUMP_BANS_INTERVAL * 1000);
18551858

src/node/context.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <interfaces/chain.h>
99
#include <net.h>
1010
#include <net_processing.h>
11+
#include <scheduler.h>
1112

1213
NodeContext::NodeContext() {}
1314
NodeContext::~NodeContext() {}

src/node/context.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
class BanMan;
1212
class CConnman;
13+
class CScheduler;
1314
class CTxMemPool;
1415
class PeerLogicValidation;
1516
namespace interfaces {
@@ -34,6 +35,7 @@ struct NodeContext {
3435
std::unique_ptr<BanMan> banman;
3536
std::unique_ptr<interfaces::Chain> chain;
3637
std::vector<std::unique_ptr<interfaces::ChainClient>> chain_clients;
38+
std::unique_ptr<CScheduler> scheduler;
3739

3840
//! Declare default constructor and destructor that are not inline, so code
3941
//! instantiating the NodeContext struct doesn't need to #include class

src/test/denialofservice_tests.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ BOOST_FIXTURE_TEST_SUITE(denialofservice_tests, TestingSetup)
7878
BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
7979
{
8080
auto connman = MakeUnique<CConnman>(0x1337, 0x1337);
81-
auto peerLogic = MakeUnique<PeerLogicValidation>(connman.get(), nullptr, scheduler);
81+
auto peerLogic = MakeUnique<PeerLogicValidation>(connman.get(), nullptr, *m_node.scheduler);
8282

8383
// Mock an outbound peer
8484
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
@@ -148,7 +148,7 @@ static void AddRandomOutboundPeer(std::vector<CNode *> &vNodes, PeerLogicValidat
148148
BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
149149
{
150150
auto connman = MakeUnique<CConnmanTest>(0x1337, 0x1337);
151-
auto peerLogic = MakeUnique<PeerLogicValidation>(connman.get(), nullptr, scheduler);
151+
auto peerLogic = MakeUnique<PeerLogicValidation>(connman.get(), nullptr, *m_node.scheduler);
152152

153153
const Consensus::Params& consensusParams = Params().GetConsensus();
154154
constexpr int max_outbound_full_relay = 8;
@@ -221,7 +221,7 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
221221
{
222222
auto banman = MakeUnique<BanMan>(GetDataDir() / "banlist.dat", nullptr, DEFAULT_MISBEHAVING_BANTIME);
223223
auto connman = MakeUnique<CConnman>(0x1337, 0x1337);
224-
auto peerLogic = MakeUnique<PeerLogicValidation>(connman.get(), banman.get(), scheduler);
224+
auto peerLogic = MakeUnique<PeerLogicValidation>(connman.get(), banman.get(), *m_node.scheduler);
225225

226226
banman->ClearBanned();
227227
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
@@ -276,7 +276,7 @@ BOOST_AUTO_TEST_CASE(DoS_banscore)
276276
{
277277
auto banman = MakeUnique<BanMan>(GetDataDir() / "banlist.dat", nullptr, DEFAULT_MISBEHAVING_BANTIME);
278278
auto connman = MakeUnique<CConnman>(0x1337, 0x1337);
279-
auto peerLogic = MakeUnique<PeerLogicValidation>(connman.get(), banman.get(), scheduler);
279+
auto peerLogic = MakeUnique<PeerLogicValidation>(connman.get(), banman.get(), *m_node.scheduler);
280280

281281
banman->ClearBanned();
282282
gArgs.ForceSetArg("-banscore", "111"); // because 11 is my favorite number
@@ -323,7 +323,7 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
323323
{
324324
auto banman = MakeUnique<BanMan>(GetDataDir() / "banlist.dat", nullptr, DEFAULT_MISBEHAVING_BANTIME);
325325
auto connman = MakeUnique<CConnman>(0x1337, 0x1337);
326-
auto peerLogic = MakeUnique<PeerLogicValidation>(connman.get(), banman.get(), scheduler);
326+
auto peerLogic = MakeUnique<PeerLogicValidation>(connman.get(), banman.get(), *m_node.scheduler);
327327

328328
banman->ClearBanned();
329329
int64_t nStartTime = GetTime();

src/test/util/setup_common.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,12 @@ TestingSetup::TestingSetup(const std::string& chainName) : BasicTestingSetup(cha
103103
g_rpc_node = &m_node;
104104
RegisterAllCoreRPCCommands(tableRPC);
105105

106+
m_node.scheduler = MakeUnique<CScheduler>();
107+
106108
// We have to run a scheduler thread to prevent ActivateBestChain
107109
// from blocking due to queue overrun.
108-
threadGroup.create_thread(std::bind(&CScheduler::serviceQueue, &scheduler));
109-
GetMainSignals().RegisterBackgroundSignalScheduler(scheduler);
110+
threadGroup.create_thread([&]{ m_node.scheduler->serviceQueue(); });
111+
GetMainSignals().RegisterBackgroundSignalScheduler(*g_rpc_node->scheduler);
110112

111113
pblocktree.reset(new CBlockTreeDB(1 << 20, true));
112114
g_chainstate = MakeUnique<CChainState>();
@@ -147,6 +149,7 @@ TestingSetup::~TestingSetup()
147149
m_node.connman.reset();
148150
m_node.banman.reset();
149151
m_node.mempool = nullptr;
152+
m_node.scheduler.reset();
150153
UnloadBlockIndex();
151154
g_chainstate.reset();
152155
pblocktree.reset();

src/test/util/setup_common.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ struct BasicTestingSetup {
8585
struct TestingSetup : public BasicTestingSetup {
8686
NodeContext m_node;
8787
boost::thread_group threadGroup;
88-
CScheduler scheduler;
8988

9089
explicit TestingSetup(const std::string& chainName = CBaseChainParams::MAIN);
9190
~TestingSetup();

0 commit comments

Comments
 (0)