Skip to content

Commit 14a77f6

Browse files
committed
refactor: accept ChainstateManager in CMNHFManager ctor
The `ConnectManager` approach is no longer needed.
1 parent 838cfcb commit 14a77f6

File tree

4 files changed

+18
-24
lines changed

4 files changed

+18
-24
lines changed

src/evo/mnhftx.cpp

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ CMutableTransaction MNHFTxPayload::PrepareTx() const
4343
return tx;
4444
}
4545

46-
CMNHFManager::CMNHFManager(CEvoDB& evoDb) :
47-
m_evoDb{evoDb}
46+
CMNHFManager::CMNHFManager(CEvoDB& evoDb, const ChainstateManager& chainman) :
47+
m_evoDb(evoDb),
48+
m_chainman{chainman}
4849
{
4950
assert(globalInstance == nullptr);
5051
globalInstance = this;
@@ -58,7 +59,7 @@ CMNHFManager::~CMNHFManager()
5859

5960
CMNHFManager::Signals CMNHFManager::GetSignalsStage(const CBlockIndex* const pindexPrev)
6061
{
61-
if (!DeploymentActiveAfter(pindexPrev, Params().GetConsensus(), Consensus::DEPLOYMENT_V20)) return {};
62+
if (!DeploymentActiveAfter(pindexPrev, m_chainman.GetConsensus(), Consensus::DEPLOYMENT_V20)) return {};
6263

6364
Signals signals_tmp = GetForBlock(pindexPrev);
6465

@@ -201,12 +202,11 @@ static bool extractSignals(const ChainstateManager& chainman, const llmq::CQuoru
201202

202203
std::optional<CMNHFManager::Signals> CMNHFManager::ProcessBlock(const CBlock& block, const CBlockIndex* const pindex, bool fJustCheck, BlockValidationState& state)
203204
{
204-
auto chainman = Assert(m_chainman.load(std::memory_order_acquire));
205205
auto qman = Assert(m_qman.load(std::memory_order_acquire));
206206

207207
try {
208208
std::vector<uint8_t> new_signals;
209-
if (!extractSignals(*chainman, *qman, block, pindex, new_signals, state)) {
209+
if (!extractSignals(m_chainman, *qman, block, pindex, new_signals, state)) {
210210
// state is set inside extractSignals
211211
return std::nullopt;
212212
}
@@ -253,12 +253,11 @@ std::optional<CMNHFManager::Signals> CMNHFManager::ProcessBlock(const CBlock& bl
253253

254254
bool CMNHFManager::UndoBlock(const CBlock& block, const CBlockIndex* const pindex)
255255
{
256-
auto chainman = Assert(m_chainman.load(std::memory_order_acquire));
257256
auto qman = Assert(m_qman.load(std::memory_order_acquire));
258257

259258
std::vector<uint8_t> excluded_signals;
260259
BlockValidationState state;
261-
if (!extractSignals(*chainman, *qman, block, pindex, excluded_signals, state)) {
260+
if (!extractSignals(m_chainman, *qman, block, pindex, excluded_signals, state)) {
262261
LogPrintf("CMNHFManager::%s: failed to extract signals\n", __func__);
263262
return false;
264263
}
@@ -330,7 +329,7 @@ std::optional<CMNHFManager::Signals> CMNHFManager::GetFromCache(const CBlockInde
330329
}
331330
{
332331
LOCK(cs_cache);
333-
if (!DeploymentActiveAt(*pindex, Params().GetConsensus(), Consensus::DEPLOYMENT_V20)) {
332+
if (!DeploymentActiveAt(*pindex, m_chainman.GetConsensus(), Consensus::DEPLOYMENT_V20)) {
334333
mnhfCache.insert(blockHash, signals);
335334
return signals;
336335
}
@@ -340,7 +339,7 @@ std::optional<CMNHFManager::Signals> CMNHFManager::GetFromCache(const CBlockInde
340339
mnhfCache.insert(blockHash, signals);
341340
return signals;
342341
}
343-
if (!DeploymentActiveAt(*pindex, Params().GetConsensus(), Consensus::DEPLOYMENT_MN_RR)) {
342+
if (!DeploymentActiveAt(*pindex, m_chainman.GetConsensus(), Consensus::DEPLOYMENT_MN_RR)) {
344343
// before mn_rr activation we are safe
345344
if (m_evoDb.Read(std::make_pair(DB_SIGNALS, blockHash), signals)) {
346345
LOCK(cs_cache);
@@ -359,7 +358,7 @@ void CMNHFManager::AddToCache(const Signals& signals, const CBlockIndex* const p
359358
LOCK(cs_cache);
360359
mnhfCache.insert(blockHash, signals);
361360
}
362-
if (!DeploymentActiveAt(*pindex, Params().GetConsensus(), Consensus::DEPLOYMENT_V20)) return;
361+
if (!DeploymentActiveAt(*pindex, m_chainman.GetConsensus(), Consensus::DEPLOYMENT_V20)) return;
363362

364363
m_evoDb.Write(std::make_pair(DB_SIGNALS_v2, blockHash), signals);
365364
}
@@ -371,31 +370,26 @@ void CMNHFManager::AddSignal(const CBlockIndex* const pindex, int bit)
371370
AddToCache(signals, pindex);
372371
}
373372

374-
void CMNHFManager::ConnectManagers(gsl::not_null<ChainstateManager*> chainman, gsl::not_null<llmq::CQuorumManager*> qman)
373+
void CMNHFManager::ConnectManagers(gsl::not_null<llmq::CQuorumManager*> qman)
375374
{
376375
// Do not allow double-initialization
377-
assert(m_chainman.load(std::memory_order_acquire) == nullptr);
378-
m_chainman.store(chainman, std::memory_order_release);
379376
assert(m_qman.load(std::memory_order_acquire) == nullptr);
380377
m_qman.store(qman, std::memory_order_release);
381378
}
382379

383380
void CMNHFManager::DisconnectManagers()
384381
{
385-
m_chainman.store(nullptr, std::memory_order_release);
386382
m_qman.store(nullptr, std::memory_order_release);
387383
}
388384

389385
bool CMNHFManager::ForceSignalDBUpdate()
390386
{
391-
auto chainman = Assert(m_chainman.load(std::memory_order_acquire));
392-
393387
// force ehf signals db update
394388
auto dbTx = m_evoDb.BeginTransaction();
395389

396390
const bool last_legacy = bls::bls_legacy_scheme.load();
397391
bls::bls_legacy_scheme.store(false);
398-
GetSignalsStage(chainman->ActiveChainstate().m_chain.Tip());
392+
GetSignalsStage(m_chainman.ActiveTip());
399393
bls::bls_legacy_scheme.store(last_legacy);
400394

401395
dbTx->Commit();

src/evo/mnhftx.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class CMNHFManager : public AbstractEHFManager
9090
{
9191
private:
9292
CEvoDB& m_evoDb;
93-
std::atomic<ChainstateManager*> m_chainman{nullptr};
93+
const ChainstateManager& m_chainman;
9494
std::atomic<llmq::CQuorumManager*> m_qman{nullptr};
9595

9696
static constexpr size_t MNHFCacheSize = 1000;
@@ -102,7 +102,7 @@ class CMNHFManager : public AbstractEHFManager
102102
CMNHFManager() = delete;
103103
CMNHFManager(const CMNHFManager&) = delete;
104104
CMNHFManager& operator=(const CMNHFManager&) = delete;
105-
explicit CMNHFManager(CEvoDB& evoDb);
105+
explicit CMNHFManager(CEvoDB& evoDb, const ChainstateManager& chainman);
106106
~CMNHFManager();
107107

108108
/**
@@ -139,7 +139,7 @@ class CMNHFManager : public AbstractEHFManager
139139
* Separated from constructor to allow LLMQContext to use CMNHFManager in read-only capacity.
140140
* Required to mutate state.
141141
*/
142-
void ConnectManagers(gsl::not_null<ChainstateManager*> chainman, gsl::not_null<llmq::CQuorumManager*> qman);
142+
void ConnectManagers(gsl::not_null<llmq::CQuorumManager*> qman);
143143

144144
/**
145145
* Reset llmq::CQuorumManager pointer.

src/node/chainstate.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ std::optional<ChainstateLoadingError> LoadChainstate(bool fReset,
7474
evodb = std::make_unique<CEvoDB>(util::DbWrapperParams{.path = data_dir, .memory = dash_dbs_in_memory, .wipe = fReset || fReindexChainState});
7575

7676
mnhf_manager.reset();
77-
mnhf_manager = std::make_unique<CMNHFManager>(*evodb);
77+
mnhf_manager = std::make_unique<CMNHFManager>(*evodb, chainman);
7878

7979
chainman.InitializeChainstate(mempool, *evodb, chain_helper);
8080
chainman.m_total_coinstip_cache = nCoinCacheUsage;
@@ -243,7 +243,7 @@ void DashChainstateSetup(ChainstateManager& chainman,
243243
util::DbWrapperParams{.path = data_dir, .memory = llmq_dbs_in_memory, .wipe = llmq_dbs_wipe});
244244
mempool->ConnectManagers(dmnman.get(), llmq_ctx->isman.get());
245245
// Enable CMNHFManager::{Process, Undo}Block
246-
mnhf_manager->ConnectManagers(&chainman, llmq_ctx->qman.get());
246+
mnhf_manager->ConnectManagers(llmq_ctx->qman.get());
247247

248248
chain_helper.reset();
249249
chain_helper = std::make_unique<CChainstateHelper>(*cpoolman, *dmnman, *mnhf_manager, govman, *(llmq_ctx->isman), *(llmq_ctx->quorum_block_processor),

src/test/util/setup_common.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,6 @@ BasicTestingSetup::BasicTestingSetup(const std::string& chainName, const std::ve
222222
m_node.netfulfilledman = std::make_unique<CNetFulfilledRequestManager>();
223223
m_node.sporkman = std::make_unique<CSporkManager>();
224224
m_node.evodb = std::make_unique<CEvoDB>(util::DbWrapperParams{.path = m_node.args->GetDataDirNet(), .memory = true, .wipe = true});
225-
m_node.mnhf_manager = std::make_unique<CMNHFManager>(*m_node.evodb);
226225

227226
static bool noui_connected = false;
228227
if (!noui_connected) {
@@ -240,7 +239,6 @@ BasicTestingSetup::~BasicTestingSetup()
240239
fs::remove_all(m_path_root);
241240
gArgs.ClearArgs();
242241

243-
m_node.mnhf_manager.reset();
244242
m_node.evodb.reset();
245243
m_node.sporkman.reset();
246244
m_node.netfulfilledman.reset();
@@ -274,6 +272,7 @@ ChainTestingSetup::ChainTestingSetup(const std::string& chainName, const std::ve
274272
m_node.chainman = std::make_unique<ChainstateManager>(chainparams);
275273
m_node.chainman->m_blockman.m_block_tree_db = std::make_unique<CBlockTreeDB>(m_cache_sizes.block_tree_db, true);
276274

275+
m_node.mnhf_manager = std::make_unique<CMNHFManager>(*m_node.evodb, *m_node.chainman);
277276
m_node.mn_sync = std::make_unique<CMasternodeSync>(std::make_unique<NodeSyncNotifierImpl>(*m_node.connman, *m_node.netfulfilledman));
278277
m_node.govman = std::make_unique<CGovernanceManager>(*m_node.mn_metaman, *m_node.netfulfilledman, *m_node.chainman, m_node.dmnman, *m_node.mn_sync);
279278

@@ -291,6 +290,7 @@ ChainTestingSetup::~ChainTestingSetup()
291290
GetMainSignals().UnregisterBackgroundSignalScheduler();
292291
m_node.govman.reset();
293292
m_node.mn_sync.reset();
293+
m_node.mnhf_manager.reset();
294294
m_node.chainman.reset();
295295
m_node.mempool.reset();
296296
m_node.fee_estimator.reset();

0 commit comments

Comments
 (0)