mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-05-17 23:56:39 +00:00
Move pblocktree global to BlockManager
This commit is contained in:
parent
fa27f03b49
commit
faa54e3757
@ -204,7 +204,7 @@ bool TxIndex::Init()
|
|||||||
// Attempt to migrate txindex from the old database to the new one. Even if
|
// Attempt to migrate txindex from the old database to the new one. Even if
|
||||||
// chain_tip is null, the node could be reindexing and we still want to
|
// chain_tip is null, the node could be reindexing and we still want to
|
||||||
// delete txindex records in the old database.
|
// delete txindex records in the old database.
|
||||||
if (!m_db->MigrateData(*pblocktree, m_chainstate->m_chain.GetLocator())) {
|
if (!m_db->MigrateData(*m_chainstate->m_blockman.m_block_tree_db, m_chainstate->m_chain.GetLocator())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,7 +264,6 @@ void Shutdown(NodeContext& node)
|
|||||||
chainstate->ResetCoinsViews();
|
chainstate->ResetCoinsViews();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pblocktree.reset();
|
|
||||||
}
|
}
|
||||||
for (const auto& client : node.chain_clients) {
|
for (const auto& client : node.chain_clients) {
|
||||||
client->stop();
|
client->stop();
|
||||||
@ -1355,6 +1354,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
|||||||
|
|
||||||
UnloadBlockIndex(node.mempool.get(), chainman);
|
UnloadBlockIndex(node.mempool.get(), chainman);
|
||||||
|
|
||||||
|
auto& pblocktree{chainman.m_blockman.m_block_tree_db};
|
||||||
// new CBlockTreeDB tries to delete the existing file, which
|
// new CBlockTreeDB tries to delete the existing file, which
|
||||||
// fails if it's still open from the previous loop. Close it first:
|
// fails if it's still open from the previous loop. Close it first:
|
||||||
pblocktree.reset();
|
pblocktree.reset();
|
||||||
|
@ -518,7 +518,7 @@ void ThreadImport(ChainstateManager& chainman, std::vector<fs::path> vImportFile
|
|||||||
}
|
}
|
||||||
nFile++;
|
nFile++;
|
||||||
}
|
}
|
||||||
pblocktree->WriteReindexing(false);
|
WITH_LOCK(::cs_main, chainman.m_blockman.m_block_tree_db->WriteReindexing(false));
|
||||||
fReindex = false;
|
fReindex = false;
|
||||||
LogPrintf("Reindexing finished\n");
|
LogPrintf("Reindexing finished\n");
|
||||||
// To avoid ending up in a situation without genesis block, re-try initializing (no-op if reindexing worked):
|
// To avoid ending up in a situation without genesis block, re-try initializing (no-op if reindexing worked):
|
||||||
|
@ -141,12 +141,11 @@ ChainTestingSetup::ChainTestingSetup(const std::string& chainName, const std::ve
|
|||||||
m_node.scheduler->m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { m_node.scheduler->serviceQueue(); });
|
m_node.scheduler->m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { m_node.scheduler->serviceQueue(); });
|
||||||
GetMainSignals().RegisterBackgroundSignalScheduler(*m_node.scheduler);
|
GetMainSignals().RegisterBackgroundSignalScheduler(*m_node.scheduler);
|
||||||
|
|
||||||
pblocktree.reset(new CBlockTreeDB(1 << 20, true));
|
|
||||||
|
|
||||||
m_node.fee_estimator = std::make_unique<CBlockPolicyEstimator>();
|
m_node.fee_estimator = std::make_unique<CBlockPolicyEstimator>();
|
||||||
m_node.mempool = std::make_unique<CTxMemPool>(m_node.fee_estimator.get(), 1);
|
m_node.mempool = std::make_unique<CTxMemPool>(m_node.fee_estimator.get(), 1);
|
||||||
|
|
||||||
m_node.chainman = std::make_unique<ChainstateManager>();
|
m_node.chainman = std::make_unique<ChainstateManager>();
|
||||||
|
m_node.chainman->m_blockman.m_block_tree_db = std::make_unique<CBlockTreeDB>(1 << 20, true);
|
||||||
|
|
||||||
// Start script-checking threads. Set g_parallel_script_checks to true so they are used.
|
// Start script-checking threads. Set g_parallel_script_checks to true so they are used.
|
||||||
constexpr int script_check_threads = 2;
|
constexpr int script_check_threads = 2;
|
||||||
@ -169,7 +168,6 @@ ChainTestingSetup::~ChainTestingSetup()
|
|||||||
m_node.scheduler.reset();
|
m_node.scheduler.reset();
|
||||||
m_node.chainman->Reset();
|
m_node.chainman->Reset();
|
||||||
m_node.chainman.reset();
|
m_node.chainman.reset();
|
||||||
pblocktree.reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TestingSetup::TestingSetup(const std::string& chainName, const std::vector<const char*>& extra_args)
|
TestingSetup::TestingSetup(const std::string& chainName, const std::vector<const char*>& extra_args)
|
||||||
|
@ -20,6 +20,7 @@ BOOST_FIXTURE_TEST_SUITE(validation_chainstate_tests, TestingSetup)
|
|||||||
BOOST_AUTO_TEST_CASE(validation_chainstate_resize_caches)
|
BOOST_AUTO_TEST_CASE(validation_chainstate_resize_caches)
|
||||||
{
|
{
|
||||||
ChainstateManager manager;
|
ChainstateManager manager;
|
||||||
|
WITH_LOCK(::cs_main, manager.m_blockman.m_block_tree_db = std::make_unique<CBlockTreeDB>(1 << 20, true));
|
||||||
CTxMemPool mempool;
|
CTxMemPool mempool;
|
||||||
|
|
||||||
//! Create and add a Coin with DynamicMemoryUsage of 80 bytes to the given view.
|
//! Create and add a Coin with DynamicMemoryUsage of 80 bytes to the given view.
|
||||||
|
@ -170,8 +170,6 @@ CBlockIndex* BlockManager::FindForkInGlobalIndex(const CChain& chain, const CBlo
|
|||||||
return chain.Genesis();
|
return chain.Genesis();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<CBlockTreeDB> pblocktree;
|
|
||||||
|
|
||||||
bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
|
bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
|
||||||
const CCoinsViewCache& inputs, unsigned int flags, bool cacheSigStore,
|
const CCoinsViewCache& inputs, unsigned int flags, bool cacheSigStore,
|
||||||
bool cacheFullScriptStore, PrecomputedTransactionData& txdata,
|
bool cacheFullScriptStore, PrecomputedTransactionData& txdata,
|
||||||
@ -2075,7 +2073,7 @@ bool CChainState::FlushStateToDisk(
|
|||||||
if (!setFilesToPrune.empty()) {
|
if (!setFilesToPrune.empty()) {
|
||||||
fFlushForPrune = true;
|
fFlushForPrune = true;
|
||||||
if (!fHavePruned) {
|
if (!fHavePruned) {
|
||||||
pblocktree->WriteFlag("prunedblockfiles", true);
|
m_blockman.m_block_tree_db->WriteFlag("prunedblockfiles", true);
|
||||||
fHavePruned = true;
|
fHavePruned = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2127,7 +2125,7 @@ bool CChainState::FlushStateToDisk(
|
|||||||
vBlocks.push_back(*it);
|
vBlocks.push_back(*it);
|
||||||
setDirtyBlockIndex.erase(it++);
|
setDirtyBlockIndex.erase(it++);
|
||||||
}
|
}
|
||||||
if (!pblocktree->WriteBatchSync(vFiles, nLastBlockFile, vBlocks)) {
|
if (!m_blockman.m_block_tree_db->WriteBatchSync(vFiles, nLastBlockFile, vBlocks)) {
|
||||||
return AbortNode(state, "Failed to write to block index database");
|
return AbortNode(state, "Failed to write to block index database");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3700,11 +3698,11 @@ CBlockIndex * BlockManager::InsertBlockIndex(const uint256& hash)
|
|||||||
|
|
||||||
bool BlockManager::LoadBlockIndex(
|
bool BlockManager::LoadBlockIndex(
|
||||||
const Consensus::Params& consensus_params,
|
const Consensus::Params& consensus_params,
|
||||||
CBlockTreeDB& blocktree,
|
|
||||||
std::set<CBlockIndex*, CBlockIndexWorkComparator>& block_index_candidates)
|
std::set<CBlockIndex*, CBlockIndexWorkComparator>& block_index_candidates)
|
||||||
{
|
{
|
||||||
if (!blocktree.LoadBlockIndexGuts(consensus_params, [this](const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { return this->InsertBlockIndex(hash); }))
|
if (!m_block_tree_db->LoadBlockIndexGuts(consensus_params, [this](const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { return this->InsertBlockIndex(hash); })) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate nChainWork
|
// Calculate nChainWork
|
||||||
std::vector<std::pair<int, CBlockIndex*> > vSortedByHeight;
|
std::vector<std::pair<int, CBlockIndex*> > vSortedByHeight;
|
||||||
@ -3767,22 +3765,22 @@ void BlockManager::Unload() {
|
|||||||
bool BlockManager::LoadBlockIndexDB(std::set<CBlockIndex*, CBlockIndexWorkComparator>& setBlockIndexCandidates)
|
bool BlockManager::LoadBlockIndexDB(std::set<CBlockIndex*, CBlockIndexWorkComparator>& setBlockIndexCandidates)
|
||||||
{
|
{
|
||||||
if (!LoadBlockIndex(
|
if (!LoadBlockIndex(
|
||||||
::Params().GetConsensus(), *pblocktree,
|
::Params().GetConsensus(),
|
||||||
setBlockIndexCandidates)) {
|
setBlockIndexCandidates)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load block file info
|
// Load block file info
|
||||||
pblocktree->ReadLastBlockFile(nLastBlockFile);
|
m_block_tree_db->ReadLastBlockFile(nLastBlockFile);
|
||||||
vinfoBlockFile.resize(nLastBlockFile + 1);
|
vinfoBlockFile.resize(nLastBlockFile + 1);
|
||||||
LogPrintf("%s: last block file = %i\n", __func__, nLastBlockFile);
|
LogPrintf("%s: last block file = %i\n", __func__, nLastBlockFile);
|
||||||
for (int nFile = 0; nFile <= nLastBlockFile; nFile++) {
|
for (int nFile = 0; nFile <= nLastBlockFile; nFile++) {
|
||||||
pblocktree->ReadBlockFileInfo(nFile, vinfoBlockFile[nFile]);
|
m_block_tree_db->ReadBlockFileInfo(nFile, vinfoBlockFile[nFile]);
|
||||||
}
|
}
|
||||||
LogPrintf("%s: last block file info: %s\n", __func__, vinfoBlockFile[nLastBlockFile].ToString());
|
LogPrintf("%s: last block file info: %s\n", __func__, vinfoBlockFile[nLastBlockFile].ToString());
|
||||||
for (int nFile = nLastBlockFile + 1; true; nFile++) {
|
for (int nFile = nLastBlockFile + 1; true; nFile++) {
|
||||||
CBlockFileInfo info;
|
CBlockFileInfo info;
|
||||||
if (pblocktree->ReadBlockFileInfo(nFile, info)) {
|
if (m_block_tree_db->ReadBlockFileInfo(nFile, info)) {
|
||||||
vinfoBlockFile.push_back(info);
|
vinfoBlockFile.push_back(info);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
@ -3807,13 +3805,13 @@ bool BlockManager::LoadBlockIndexDB(std::set<CBlockIndex*, CBlockIndexWorkCompar
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check whether we have ever pruned block & undo files
|
// Check whether we have ever pruned block & undo files
|
||||||
pblocktree->ReadFlag("prunedblockfiles", fHavePruned);
|
m_block_tree_db->ReadFlag("prunedblockfiles", fHavePruned);
|
||||||
if (fHavePruned)
|
if (fHavePruned)
|
||||||
LogPrintf("LoadBlockIndexDB(): Block files have previously been pruned\n");
|
LogPrintf("LoadBlockIndexDB(): Block files have previously been pruned\n");
|
||||||
|
|
||||||
// Check whether we need to continue reindexing
|
// Check whether we need to continue reindexing
|
||||||
bool fReindexing = false;
|
bool fReindexing = false;
|
||||||
pblocktree->ReadReindexing(fReindexing);
|
m_block_tree_db->ReadReindexing(fReindexing);
|
||||||
if(fReindexing) fReindex = true;
|
if(fReindexing) fReindex = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -446,6 +446,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
std::multimap<CBlockIndex*, CBlockIndex*> m_blocks_unlinked;
|
std::multimap<CBlockIndex*, CBlockIndex*> m_blocks_unlinked;
|
||||||
|
|
||||||
|
std::unique_ptr<CBlockTreeDB> m_block_tree_db GUARDED_BY(::cs_main);
|
||||||
|
|
||||||
bool LoadBlockIndexDB(std::set<CBlockIndex*, CBlockIndexWorkComparator>& setBlockIndexCandidates) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
|
bool LoadBlockIndexDB(std::set<CBlockIndex*, CBlockIndexWorkComparator>& setBlockIndexCandidates) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -458,7 +460,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool LoadBlockIndex(
|
bool LoadBlockIndex(
|
||||||
const Consensus::Params& consensus_params,
|
const Consensus::Params& consensus_params,
|
||||||
CBlockTreeDB& blocktree,
|
|
||||||
std::set<CBlockIndex*, CBlockIndexWorkComparator>& block_index_candidates)
|
std::set<CBlockIndex*, CBlockIndexWorkComparator>& block_index_candidates)
|
||||||
EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
|
|
||||||
@ -1047,9 +1048,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Global variable that points to the active block tree (protected by cs_main) */
|
|
||||||
extern std::unique_ptr<CBlockTreeDB> pblocktree;
|
|
||||||
|
|
||||||
using FopenFn = std::function<FILE*(const fs::path&, const char*)>;
|
using FopenFn = std::function<FILE*(const fs::path&, const char*)>;
|
||||||
|
|
||||||
/** Dump the mempool to disk. */
|
/** Dump the mempool to disk. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user