mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-05 04:31:45 +02:00
Add BlockManager::IsPruneMode()
This commit is contained in:
parent
fae71fe27e
commit
faf7b4f1fc
@ -415,8 +415,9 @@ IndexSummary BaseIndex::GetSummary() const
|
|||||||
return summary;
|
return summary;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseIndex::SetBestBlockIndex(const CBlockIndex* block) {
|
void BaseIndex::SetBestBlockIndex(const CBlockIndex* block)
|
||||||
assert(!node::fPruneMode || AllowPrune());
|
{
|
||||||
|
assert(!m_chainstate->m_blockman.IsPruneMode() || AllowPrune());
|
||||||
|
|
||||||
if (AllowPrune() && block) {
|
if (AllowPrune() && block) {
|
||||||
node::PruneLockInfo prune_lock;
|
node::PruneLockInfo prune_lock;
|
||||||
|
@ -1479,7 +1479,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
|||||||
options.mempool = Assert(node.mempool.get());
|
options.mempool = Assert(node.mempool.get());
|
||||||
options.reindex = node::fReindex;
|
options.reindex = node::fReindex;
|
||||||
options.reindex_chainstate = fReindexChainState;
|
options.reindex_chainstate = fReindexChainState;
|
||||||
options.prune = node::fPruneMode;
|
options.prune = chainman.m_blockman.IsPruneMode();
|
||||||
options.check_blocks = args.GetIntArg("-checkblocks", DEFAULT_CHECKBLOCKS);
|
options.check_blocks = args.GetIntArg("-checkblocks", DEFAULT_CHECKBLOCKS);
|
||||||
options.check_level = args.GetIntArg("-checklevel", DEFAULT_CHECKLEVEL);
|
options.check_level = args.GetIntArg("-checklevel", DEFAULT_CHECKLEVEL);
|
||||||
options.check_interrupt = ShutdownRequested;
|
options.check_interrupt = ShutdownRequested;
|
||||||
@ -1589,7 +1589,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
|||||||
|
|
||||||
// if pruning, perform the initial blockstore prune
|
// if pruning, perform the initial blockstore prune
|
||||||
// after any wallet rescanning has taken place.
|
// after any wallet rescanning has taken place.
|
||||||
if (fPruneMode) {
|
if (chainman.m_blockman.IsPruneMode()) {
|
||||||
if (!fReindex) {
|
if (!fReindex) {
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
for (Chainstate* chainstate : chainman.GetAll()) {
|
for (Chainstate* chainstate : chainman.GetAll()) {
|
||||||
@ -1618,7 +1618,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
|||||||
// On first startup, warn on low block storage space
|
// On first startup, warn on low block storage space
|
||||||
if (!fReindex && !fReindexChainState && chain_active_height <= 1) {
|
if (!fReindex && !fReindexChainState && chain_active_height <= 1) {
|
||||||
uint64_t additional_bytes_needed{
|
uint64_t additional_bytes_needed{
|
||||||
fPruneMode ?
|
chainman.m_blockman.IsPruneMode() ?
|
||||||
chainman.m_blockman.GetPruneTarget() :
|
chainman.m_blockman.GetPruneTarget() :
|
||||||
chainparams.AssumedBlockchainSize() * 1024 * 1024 * 1024};
|
chainparams.AssumedBlockchainSize() * 1024 * 1024 * 1024};
|
||||||
|
|
||||||
|
@ -53,7 +53,6 @@
|
|||||||
|
|
||||||
using node::ReadBlockFromDisk;
|
using node::ReadBlockFromDisk;
|
||||||
using node::ReadRawBlockFromDisk;
|
using node::ReadRawBlockFromDisk;
|
||||||
using node::fPruneMode;
|
|
||||||
|
|
||||||
/** How long to cache transactions in mapRelay for normal relay */
|
/** How long to cache transactions in mapRelay for normal relay */
|
||||||
static constexpr auto RELAY_TX_CACHE_TIME = 15min;
|
static constexpr auto RELAY_TX_CACHE_TIME = 15min;
|
||||||
@ -3809,8 +3808,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
|||||||
// If pruning, don't inv blocks unless we have on disk and are likely to still have
|
// If pruning, don't inv blocks unless we have on disk and are likely to still have
|
||||||
// for some reasonable time window (1 hour) that block relay might require.
|
// for some reasonable time window (1 hour) that block relay might require.
|
||||||
const int nPrunedBlocksLikelyToHave = MIN_BLOCKS_TO_KEEP - 3600 / m_chainparams.GetConsensus().nPowTargetSpacing;
|
const int nPrunedBlocksLikelyToHave = MIN_BLOCKS_TO_KEEP - 3600 / m_chainparams.GetConsensus().nPowTargetSpacing;
|
||||||
if (fPruneMode && (!(pindex->nStatus & BLOCK_HAVE_DATA) || pindex->nHeight <= m_chainman.ActiveChain().Tip()->nHeight - nPrunedBlocksLikelyToHave))
|
if (m_chainman.m_blockman.IsPruneMode() && (!(pindex->nStatus & BLOCK_HAVE_DATA) || pindex->nHeight <= m_chainman.ActiveChain().Tip()->nHeight - nPrunedBlocksLikelyToHave)) {
|
||||||
{
|
|
||||||
LogPrint(BCLog::NET, " getblocks stopping, pruned or too old block at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
|
LogPrint(BCLog::NET, " getblocks stopping, pruned or too old block at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -48,8 +48,6 @@ static constexpr size_t BLOCK_SERIALIZATION_HEADER_SIZE = CMessageHeader::MESSAG
|
|||||||
|
|
||||||
extern std::atomic_bool fImporting;
|
extern std::atomic_bool fImporting;
|
||||||
extern std::atomic_bool fReindex;
|
extern std::atomic_bool fReindex;
|
||||||
/** Pruning-related variables and constants */
|
|
||||||
/** True if we're running in -prune mode. */
|
|
||||||
extern bool fPruneMode;
|
extern bool fPruneMode;
|
||||||
extern uint64_t nPruneTarget;
|
extern uint64_t nPruneTarget;
|
||||||
|
|
||||||
@ -175,6 +173,9 @@ public:
|
|||||||
/** Store block on disk. If dbp is not nullptr, then it provides the known position of the block within a block file on disk. */
|
/** Store block on disk. If dbp is not nullptr, then it provides the known position of the block within a block file on disk. */
|
||||||
FlatFilePos SaveBlockToDisk(const CBlock& block, int nHeight, CChain& active_chain, const CChainParams& chainparams, const FlatFilePos* dbp);
|
FlatFilePos SaveBlockToDisk(const CBlock& block, int nHeight, CChain& active_chain, const CChainParams& chainparams, const FlatFilePos* dbp);
|
||||||
|
|
||||||
|
/** Whether running in -prune mode. */
|
||||||
|
[[nodiscard]] bool IsPruneMode() const { return fPruneMode; }
|
||||||
|
|
||||||
/** Attempt to stay below this number of bytes of block files. */
|
/** Attempt to stay below this number of bytes of block files. */
|
||||||
[[nodiscard]] uint64_t GetPruneTarget() const { return nPruneTarget; }
|
[[nodiscard]] uint64_t GetPruneTarget() const { return nPruneTarget; }
|
||||||
|
|
||||||
|
@ -464,7 +464,7 @@ static RPCHelpMan getblockfrompeer()
|
|||||||
|
|
||||||
// Fetching blocks before the node has syncing past their height can prevent block files from
|
// Fetching blocks before the node has syncing past their height can prevent block files from
|
||||||
// being pruned, so we avoid it if the node is in prune mode.
|
// being pruned, so we avoid it if the node is in prune mode.
|
||||||
if (node::fPruneMode && index->nHeight > WITH_LOCK(chainman.GetMutex(), return chainman.ActiveTip()->nHeight)) {
|
if (chainman.m_blockman.IsPruneMode() && index->nHeight > WITH_LOCK(chainman.GetMutex(), return chainman.ActiveTip()->nHeight)) {
|
||||||
throw JSONRPCError(RPC_MISC_ERROR, "In prune mode, only blocks that the node has already synced previously can be fetched from a peer");
|
throw JSONRPCError(RPC_MISC_ERROR, "In prune mode, only blocks that the node has already synced previously can be fetched from a peer");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -778,10 +778,11 @@ static RPCHelpMan pruneblockchain()
|
|||||||
},
|
},
|
||||||
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
|
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
|
||||||
{
|
{
|
||||||
if (!node::fPruneMode)
|
|
||||||
throw JSONRPCError(RPC_MISC_ERROR, "Cannot prune blocks because node is not in prune mode.");
|
|
||||||
|
|
||||||
ChainstateManager& chainman = EnsureAnyChainman(request.context);
|
ChainstateManager& chainman = EnsureAnyChainman(request.context);
|
||||||
|
if (!chainman.m_blockman.IsPruneMode()) {
|
||||||
|
throw JSONRPCError(RPC_MISC_ERROR, "Cannot prune blocks because node is not in prune mode.");
|
||||||
|
}
|
||||||
|
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
Chainstate& active_chainstate = chainman.ActiveChainstate();
|
Chainstate& active_chainstate = chainman.ActiveChainstate();
|
||||||
CChain& active_chain = active_chainstate.m_chain;
|
CChain& active_chain = active_chainstate.m_chain;
|
||||||
@ -1265,8 +1266,8 @@ RPCHelpMan getblockchaininfo()
|
|||||||
obj.pushKV("initialblockdownload", active_chainstate.IsInitialBlockDownload());
|
obj.pushKV("initialblockdownload", active_chainstate.IsInitialBlockDownload());
|
||||||
obj.pushKV("chainwork", tip.nChainWork.GetHex());
|
obj.pushKV("chainwork", tip.nChainWork.GetHex());
|
||||||
obj.pushKV("size_on_disk", chainman.m_blockman.CalculateCurrentUsage());
|
obj.pushKV("size_on_disk", chainman.m_blockman.CalculateCurrentUsage());
|
||||||
obj.pushKV("pruned", node::fPruneMode);
|
obj.pushKV("pruned", chainman.m_blockman.IsPruneMode());
|
||||||
if (node::fPruneMode) {
|
if (chainman.m_blockman.IsPruneMode()) {
|
||||||
obj.pushKV("pruneheight", chainman.m_blockman.GetFirstStoredBlock(tip)->nHeight);
|
obj.pushKV("pruneheight", chainman.m_blockman.GetFirstStoredBlock(tip)->nHeight);
|
||||||
|
|
||||||
// if 0, execution bypasses the whole if block.
|
// if 0, execution bypasses the whole if block.
|
||||||
|
@ -208,23 +208,24 @@ ChainTestingSetup::~ChainTestingSetup()
|
|||||||
|
|
||||||
void TestingSetup::LoadVerifyActivateChainstate()
|
void TestingSetup::LoadVerifyActivateChainstate()
|
||||||
{
|
{
|
||||||
|
auto& chainman{*Assert(m_node.chainman)};
|
||||||
node::ChainstateLoadOptions options;
|
node::ChainstateLoadOptions options;
|
||||||
options.mempool = Assert(m_node.mempool.get());
|
options.mempool = Assert(m_node.mempool.get());
|
||||||
options.block_tree_db_in_memory = m_block_tree_db_in_memory;
|
options.block_tree_db_in_memory = m_block_tree_db_in_memory;
|
||||||
options.coins_db_in_memory = m_coins_db_in_memory;
|
options.coins_db_in_memory = m_coins_db_in_memory;
|
||||||
options.reindex = node::fReindex;
|
options.reindex = node::fReindex;
|
||||||
options.reindex_chainstate = m_args.GetBoolArg("-reindex-chainstate", false);
|
options.reindex_chainstate = m_args.GetBoolArg("-reindex-chainstate", false);
|
||||||
options.prune = node::fPruneMode;
|
options.prune = chainman.m_blockman.IsPruneMode();
|
||||||
options.check_blocks = m_args.GetIntArg("-checkblocks", DEFAULT_CHECKBLOCKS);
|
options.check_blocks = m_args.GetIntArg("-checkblocks", DEFAULT_CHECKBLOCKS);
|
||||||
options.check_level = m_args.GetIntArg("-checklevel", DEFAULT_CHECKLEVEL);
|
options.check_level = m_args.GetIntArg("-checklevel", DEFAULT_CHECKLEVEL);
|
||||||
auto [status, error] = LoadChainstate(*Assert(m_node.chainman), m_cache_sizes, options);
|
auto [status, error] = LoadChainstate(chainman, m_cache_sizes, options);
|
||||||
assert(status == node::ChainstateLoadStatus::SUCCESS);
|
assert(status == node::ChainstateLoadStatus::SUCCESS);
|
||||||
|
|
||||||
std::tie(status, error) = VerifyLoadedChainstate(*Assert(m_node.chainman), options);
|
std::tie(status, error) = VerifyLoadedChainstate(chainman, options);
|
||||||
assert(status == node::ChainstateLoadStatus::SUCCESS);
|
assert(status == node::ChainstateLoadStatus::SUCCESS);
|
||||||
|
|
||||||
BlockValidationState state;
|
BlockValidationState state;
|
||||||
if (!m_node.chainman->ActiveChainstate().ActivateBestChain(state)) {
|
if (!chainman.ActiveChainstate().ActivateBestChain(state)) {
|
||||||
throw std::runtime_error(strprintf("ActivateBestChain failed. (%s)", state.ToString()));
|
throw std::runtime_error(strprintf("ActivateBestChain failed. (%s)", state.ToString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,6 @@ using node::BlockManager;
|
|||||||
using node::BlockMap;
|
using node::BlockMap;
|
||||||
using node::CBlockIndexHeightOnlyComparator;
|
using node::CBlockIndexHeightOnlyComparator;
|
||||||
using node::CBlockIndexWorkComparator;
|
using node::CBlockIndexWorkComparator;
|
||||||
using node::fPruneMode;
|
|
||||||
using node::fReindex;
|
using node::fReindex;
|
||||||
using node::ReadBlockFromDisk;
|
using node::ReadBlockFromDisk;
|
||||||
using node::SnapshotMetadata;
|
using node::SnapshotMetadata;
|
||||||
@ -2411,7 +2410,7 @@ bool Chainstate::FlushStateToDisk(
|
|||||||
|
|
||||||
CoinsCacheSizeState cache_state = GetCoinsCacheSizeState();
|
CoinsCacheSizeState cache_state = GetCoinsCacheSizeState();
|
||||||
LOCK(m_blockman.cs_LastBlockFile);
|
LOCK(m_blockman.cs_LastBlockFile);
|
||||||
if (fPruneMode && (m_blockman.m_check_for_pruning || nManualPruneHeight > 0) && !fReindex) {
|
if (m_blockman.IsPruneMode() && (m_blockman.m_check_for_pruning || nManualPruneHeight > 0) && !fReindex) {
|
||||||
// make sure we don't prune above any of the prune locks bestblocks
|
// make sure we don't prune above any of the prune locks bestblocks
|
||||||
// pruning is height-based
|
// pruning is height-based
|
||||||
int last_prune{m_chain.Height()}; // last height we can prune
|
int last_prune{m_chain.Height()}; // last height we can prune
|
||||||
@ -4097,7 +4096,7 @@ bool CVerifyDB::VerifyDB(
|
|||||||
if (pindex->nHeight <= chainstate.m_chain.Height() - nCheckDepth) {
|
if (pindex->nHeight <= chainstate.m_chain.Height() - nCheckDepth) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((fPruneMode || is_snapshot_cs) && !(pindex->nStatus & BLOCK_HAVE_DATA)) {
|
if ((chainstate.m_blockman.IsPruneMode() || is_snapshot_cs) && !(pindex->nStatus & BLOCK_HAVE_DATA)) {
|
||||||
// If pruning or running under an assumeutxo snapshot, only go
|
// If pruning or running under an assumeutxo snapshot, only go
|
||||||
// back as far as we have data.
|
// back as far as we have data.
|
||||||
LogPrintf("VerifyDB(): block verification stopping at height %d (pruning, no data)\n", pindex->nHeight);
|
LogPrintf("VerifyDB(): block verification stopping at height %d (pruning, no data)\n", pindex->nHeight);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user