mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-21 14:34:49 +01:00
refactor: Move pruning/reindex/importing globals to blockstorage
Can be reviewed with --color-moved=dimmed-zebra
This commit is contained in:
parent
19a56d1519
commit
fa81c30c6f
6 changed files with 68 additions and 62 deletions
41
src/init.cpp
41
src/init.cpp
|
@ -593,47 +593,6 @@ static void BlockNotifyGenesisWait(const CBlockIndex* pBlockIndex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we're using -prune with -reindex, then delete block files that will be ignored by the
|
|
||||||
// reindex. Since reindexing works by starting at block file 0 and looping until a blockfile
|
|
||||||
// is missing, do the same here to delete any later block files after a gap. Also delete all
|
|
||||||
// rev files since they'll be rewritten by the reindex anyway. This ensures that vinfoBlockFile
|
|
||||||
// is in sync with what's actually on disk by the time we start downloading, so that pruning
|
|
||||||
// works correctly.
|
|
||||||
static void CleanupBlockRevFiles()
|
|
||||||
{
|
|
||||||
std::map<std::string, fs::path> mapBlockFiles;
|
|
||||||
|
|
||||||
// Glob all blk?????.dat and rev?????.dat files from the blocks directory.
|
|
||||||
// Remove the rev files immediately and insert the blk file paths into an
|
|
||||||
// ordered map keyed by block file index.
|
|
||||||
LogPrintf("Removing unusable blk?????.dat and rev?????.dat files for -reindex with -prune\n");
|
|
||||||
fs::path blocksdir = gArgs.GetBlocksDirPath();
|
|
||||||
for (fs::directory_iterator it(blocksdir); it != fs::directory_iterator(); it++) {
|
|
||||||
if (fs::is_regular_file(*it) &&
|
|
||||||
it->path().filename().string().length() == 12 &&
|
|
||||||
it->path().filename().string().substr(8,4) == ".dat")
|
|
||||||
{
|
|
||||||
if (it->path().filename().string().substr(0,3) == "blk")
|
|
||||||
mapBlockFiles[it->path().filename().string().substr(3,5)] = it->path();
|
|
||||||
else if (it->path().filename().string().substr(0,3) == "rev")
|
|
||||||
remove(it->path());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove all block files that aren't part of a contiguous set starting at
|
|
||||||
// zero by walking the ordered map (keys are block file indices) by
|
|
||||||
// keeping a separate counter. Once we hit a gap (or if 0 doesn't exist)
|
|
||||||
// start removing block files.
|
|
||||||
int nContigCounter = 0;
|
|
||||||
for (const std::pair<const std::string, fs::path>& item : mapBlockFiles) {
|
|
||||||
if (atoi(item.first) == nContigCounter) {
|
|
||||||
nContigCounter++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
remove(item.second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HAVE_SYSTEM
|
#if HAVE_SYSTEM
|
||||||
static void StartupNotify(const ArgsManager& args)
|
static void StartupNotify(const ArgsManager& args)
|
||||||
{
|
{
|
||||||
|
|
|
@ -15,6 +15,58 @@
|
||||||
#include <util/system.h>
|
#include <util/system.h>
|
||||||
#include <validation.h>
|
#include <validation.h>
|
||||||
|
|
||||||
|
std::atomic_bool fImporting(false);
|
||||||
|
std::atomic_bool fReindex(false);
|
||||||
|
bool fHavePruned = false;
|
||||||
|
bool fPruneMode = false;
|
||||||
|
uint64_t nPruneTarget = 0;
|
||||||
|
|
||||||
|
bool IsBlockPruned(const CBlockIndex* pblockindex)
|
||||||
|
{
|
||||||
|
return (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we're using -prune with -reindex, then delete block files that will be ignored by the
|
||||||
|
// reindex. Since reindexing works by starting at block file 0 and looping until a blockfile
|
||||||
|
// is missing, do the same here to delete any later block files after a gap. Also delete all
|
||||||
|
// rev files since they'll be rewritten by the reindex anyway. This ensures that vinfoBlockFile
|
||||||
|
// is in sync with what's actually on disk by the time we start downloading, so that pruning
|
||||||
|
// works correctly.
|
||||||
|
void CleanupBlockRevFiles()
|
||||||
|
{
|
||||||
|
std::map<std::string, fs::path> mapBlockFiles;
|
||||||
|
|
||||||
|
// Glob all blk?????.dat and rev?????.dat files from the blocks directory.
|
||||||
|
// Remove the rev files immediately and insert the blk file paths into an
|
||||||
|
// ordered map keyed by block file index.
|
||||||
|
LogPrintf("Removing unusable blk?????.dat and rev?????.dat files for -reindex with -prune\n");
|
||||||
|
fs::path blocksdir = gArgs.GetBlocksDirPath();
|
||||||
|
for (fs::directory_iterator it(blocksdir); it != fs::directory_iterator(); it++) {
|
||||||
|
if (fs::is_regular_file(*it) &&
|
||||||
|
it->path().filename().string().length() == 12 &&
|
||||||
|
it->path().filename().string().substr(8,4) == ".dat")
|
||||||
|
{
|
||||||
|
if (it->path().filename().string().substr(0,3) == "blk")
|
||||||
|
mapBlockFiles[it->path().filename().string().substr(3,5)] = it->path();
|
||||||
|
else if (it->path().filename().string().substr(0,3) == "rev")
|
||||||
|
remove(it->path());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove all block files that aren't part of a contiguous set starting at
|
||||||
|
// zero by walking the ordered map (keys are block file indices) by
|
||||||
|
// keeping a separate counter. Once we hit a gap (or if 0 doesn't exist)
|
||||||
|
// start removing block files.
|
||||||
|
int nContigCounter = 0;
|
||||||
|
for (const std::pair<const std::string, fs::path>& item : mapBlockFiles) {
|
||||||
|
if (atoi(item.first) == nContigCounter) {
|
||||||
|
nContigCounter++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
remove(item.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// From validation. TODO move here
|
// From validation. TODO move here
|
||||||
bool FindBlockPos(FlatFilePos& pos, unsigned int nAddSize, unsigned int nHeight, CChain& active_chain, uint64_t nTime, bool fKnown = false);
|
bool FindBlockPos(FlatFilePos& pos, unsigned int nAddSize, unsigned int nHeight, CChain& active_chain, uint64_t nTime, bool fKnown = false);
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,21 @@ struct Params;
|
||||||
|
|
||||||
static constexpr bool DEFAULT_STOPAFTERBLOCKIMPORT{false};
|
static constexpr bool DEFAULT_STOPAFTERBLOCKIMPORT{false};
|
||||||
|
|
||||||
|
extern std::atomic_bool fImporting;
|
||||||
|
extern std::atomic_bool fReindex;
|
||||||
|
/** Pruning-related variables and constants */
|
||||||
|
/** True if any block files have ever been pruned. */
|
||||||
|
extern bool fHavePruned;
|
||||||
|
/** True if we're running in -prune mode. */
|
||||||
|
extern bool fPruneMode;
|
||||||
|
/** Number of MiB of block files that we're trying to stay below. */
|
||||||
|
extern uint64_t nPruneTarget;
|
||||||
|
|
||||||
|
//! Check whether the block associated with this index entry is pruned or not.
|
||||||
|
bool IsBlockPruned(const CBlockIndex* pblockindex);
|
||||||
|
|
||||||
|
void CleanupBlockRevFiles();
|
||||||
|
|
||||||
/** Functions for disk access for blocks */
|
/** Functions for disk access for blocks */
|
||||||
bool ReadBlockFromDisk(CBlock& block, const FlatFilePos& pos, const Consensus::Params& consensusParams);
|
bool ReadBlockFromDisk(CBlock& block, const FlatFilePos& pos, const Consensus::Params& consensusParams);
|
||||||
bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams);
|
bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams);
|
||||||
|
|
|
@ -135,14 +135,9 @@ Mutex g_best_block_mutex;
|
||||||
std::condition_variable g_best_block_cv;
|
std::condition_variable g_best_block_cv;
|
||||||
uint256 g_best_block;
|
uint256 g_best_block;
|
||||||
bool g_parallel_script_checks{false};
|
bool g_parallel_script_checks{false};
|
||||||
std::atomic_bool fImporting(false);
|
|
||||||
std::atomic_bool fReindex(false);
|
|
||||||
bool fHavePruned = false;
|
|
||||||
bool fPruneMode = false;
|
|
||||||
bool fRequireStandard = true;
|
bool fRequireStandard = true;
|
||||||
bool fCheckBlockIndex = false;
|
bool fCheckBlockIndex = false;
|
||||||
bool fCheckpointsEnabled = DEFAULT_CHECKPOINTS_ENABLED;
|
bool fCheckpointsEnabled = DEFAULT_CHECKPOINTS_ENABLED;
|
||||||
uint64_t nPruneTarget = 0;
|
|
||||||
int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE;
|
int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE;
|
||||||
|
|
||||||
uint256 hashAssumeValid;
|
uint256 hashAssumeValid;
|
||||||
|
|
|
@ -112,8 +112,6 @@ typedef std::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap;
|
||||||
extern Mutex g_best_block_mutex;
|
extern Mutex g_best_block_mutex;
|
||||||
extern std::condition_variable g_best_block_cv;
|
extern std::condition_variable g_best_block_cv;
|
||||||
extern uint256 g_best_block;
|
extern uint256 g_best_block;
|
||||||
extern std::atomic_bool fImporting;
|
|
||||||
extern std::atomic_bool fReindex;
|
|
||||||
/** Whether there are dedicated script-checking threads running.
|
/** Whether there are dedicated script-checking threads running.
|
||||||
* False indicates all script checking is done on the main threadMessageHandler thread.
|
* False indicates all script checking is done on the main threadMessageHandler thread.
|
||||||
*/
|
*/
|
||||||
|
@ -135,13 +133,6 @@ extern arith_uint256 nMinimumChainWork;
|
||||||
/** Best header we've seen so far (used for getheaders queries' starting points). */
|
/** Best header we've seen so far (used for getheaders queries' starting points). */
|
||||||
extern CBlockIndex *pindexBestHeader;
|
extern CBlockIndex *pindexBestHeader;
|
||||||
|
|
||||||
/** Pruning-related variables and constants */
|
|
||||||
/** True if any block files have ever been pruned. */
|
|
||||||
extern bool fHavePruned;
|
|
||||||
/** True if we're running in -prune mode. */
|
|
||||||
extern bool fPruneMode;
|
|
||||||
/** Number of MiB of block files that we're trying to stay below. */
|
|
||||||
extern uint64_t nPruneTarget;
|
|
||||||
/** Documentation for argument 'checklevel'. */
|
/** Documentation for argument 'checklevel'. */
|
||||||
extern const std::vector<std::string> CHECKLEVEL_DOC;
|
extern const std::vector<std::string> CHECKLEVEL_DOC;
|
||||||
|
|
||||||
|
@ -1012,12 +1003,6 @@ bool DumpMempool(const CTxMemPool& pool, FopenFn mockable_fopen_function = fsbri
|
||||||
/** Load the mempool from disk. */
|
/** Load the mempool from disk. */
|
||||||
bool LoadMempool(CTxMemPool& pool, CChainState& active_chainstate, FopenFn mockable_fopen_function = fsbridge::fopen);
|
bool LoadMempool(CTxMemPool& pool, CChainState& active_chainstate, FopenFn mockable_fopen_function = fsbridge::fopen);
|
||||||
|
|
||||||
//! Check whether the block associated with this index entry is pruned or not.
|
|
||||||
inline bool IsBlockPruned(const CBlockIndex* pblockindex)
|
|
||||||
{
|
|
||||||
return (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the expected assumeutxo value for a given height, if one exists.
|
* Return the expected assumeutxo value for a given height, if one exists.
|
||||||
*
|
*
|
||||||
|
|
|
@ -43,7 +43,7 @@ KNOWN_VIOLATIONS=(
|
||||||
"src/dbwrapper.cpp.*stoul"
|
"src/dbwrapper.cpp.*stoul"
|
||||||
"src/dbwrapper.cpp:.*vsnprintf"
|
"src/dbwrapper.cpp:.*vsnprintf"
|
||||||
"src/httprpc.cpp.*trim"
|
"src/httprpc.cpp.*trim"
|
||||||
"src/init.cpp:.*atoi"
|
"src/node/blockstorage.cpp:.*atoi"
|
||||||
"src/qt/rpcconsole.cpp:.*atoi"
|
"src/qt/rpcconsole.cpp:.*atoi"
|
||||||
"src/rest.cpp:.*strtol"
|
"src/rest.cpp:.*strtol"
|
||||||
"src/test/dbwrapper_tests.cpp:.*snprintf"
|
"src/test/dbwrapper_tests.cpp:.*snprintf"
|
||||||
|
|
Loading…
Add table
Reference in a new issue