Bitcoin ABC 0.30.3
P2P Digital Currency
|
Maintains a tree of blocks (stored in m_block_index
) which is consulted to determine where the most-work tip is.
More...
#include <blockstorage.h>
Public Types | |
using | Options = kernel::BlockManagerOpts |
Public Member Functions | |
BlockManager (Options opts) | |
BlockMap m_block_index | GUARDED_BY (cs_main) |
std::unique_ptr< CBlockTreeDB > m_block_tree_db | GUARDED_BY (::cs_main) |
bool WriteBlockIndexDB() EXCLUSIVE_LOCKS_REQUIRED(bool LoadBlockIndexDB() EXCLUSIVE_LOCKS_REQUIRED(void ScanAndUnlinkAlreadyPrunedFiles() EXCLUSIVE_LOCKS_REQUIRED(CBlockIndex * | AddToBlockIndex (const CBlockHeader &block, CBlockIndex *&best_header) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Remove any pruned block & undo files that are still on disk. More... | |
CBlockIndex * | InsertBlockIndex (const BlockHash &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Create a new block index entry for a given block hash. More... | |
void | PruneOneBlockFile (const int fileNumber) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Mark one block file as pruned (modify associated database entries) More... | |
CBlockIndex * | LookupBlockIndex (const BlockHash &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
const CBlockIndex * | LookupBlockIndex (const BlockHash &hash) const EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
CBlockFileInfo * | GetBlockFileInfo (size_t n) |
Get block file info entry for one block file. More... | |
bool | IsPruneMode () const |
Whether running in -prune mode. More... | |
uint64_t | GetPruneTarget () const |
Attempt to stay below this number of bytes of block files. More... | |
bool | LoadingBlocks () const |
bool | StopAfterBlockImport () const |
uint64_t | CalculateCurrentUsage () |
Calculate the amount of disk space the block & undo files currently use. More... | |
const CBlockIndex * | GetLastCheckpoint (const CCheckpointData &data) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Returns last CBlockIndex* that is a checkpoint. More... | |
fs::path | GetBlockPosFilename (const FlatFilePos &pos) const |
Translation to a filesystem path. More... | |
void | UnlinkPrunedFiles (const std::set< int > &setFilesToPrune) const |
Actually unlink the specified files. More... | |
bool | ReadBlockFromDisk (CBlock &block, const FlatFilePos &pos) const |
Functions for disk access for blocks. More... | |
bool | ReadBlockFromDisk (CBlock &block, const CBlockIndex &index) const |
bool | UndoReadFromDisk (CBlockUndo &blockundo, const CBlockIndex &index) const |
bool | ReadTxFromDisk (CMutableTransaction &tx, const FlatFilePos &pos) const |
Functions for disk access for txs. More... | |
bool | ReadTxUndoFromDisk (CTxUndo &tx, const FlatFilePos &pos) const |
void | CleanupBlockRevFiles () const |
Public Attributes | |
std::atomic< bool > | m_importing {false} |
std::vector< CBlockIndex * > GetAllBlockIndices() EXCLUSIVE_LOCKS_REQUIRED(std::multimap< CBlockIndex *, CBlockIndex * > | m_blocks_unlinked |
All pairs A->B, where A (or one of its ancestors) misses transactions, but B has transactions. More... | |
bool WriteUndoDataForBlock(const CBlockUndo &blockundo, BlockValidationState &state, CBlockIndex &block) EXCLUSIVE_LOCKS_REQUIRED(FlatFilePos | SaveBlockToDisk (const CBlock &block, int nHeight, CChain &active_chain, const FlatFilePos *dbp) |
Store block on disk. More... | |
const CBlockIndex *GetFirstStoredBlock(const CBlockIndex &start_block) EXCLUSIVE_LOCKS_REQUIRED(bool | m_have_pruned = false |
Find the first block that is not pruned. More... | |
bool IsBlockPruned(const CBlockIndex *pblockindex) EXCLUSIVE_LOCKS_REQUIRED(void UpdatePruneLock(const std::string &name, const PruneLockInfo &lock_info) EXCLUSIVE_LOCKS_REQUIRED(FILE | OpenBlockFile )(const FlatFilePos &pos, bool fReadOnly=false) const |
Check whether the block associated with this index entry is pruned or not. More... | |
Static Public Attributes | |
static constexpr auto | PRUNE_TARGET_MANUAL |
Private Member Functions | |
const CChainParams & | GetParams () const |
const Consensus::Params & | GetConsensus () const |
bool | LoadBlockIndex () EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Load the blocktree off disk and into memory. More... | |
void | FlushBlockFile (bool fFinalize=false, bool finalize_undo=false) |
void | FlushUndoFile (int block_file, bool finalize=false) |
bool | FindBlockPos (FlatFilePos &pos, unsigned int nAddSize, unsigned int nHeight, CChain &active_chain, uint64_t nTime, bool fKnown) |
bool | FindUndoPos (BlockValidationState &state, int nFile, FlatFilePos &pos, unsigned int nAddSize) |
FlatFileSeq | BlockFileSeq () const |
FlatFileSeq | UndoFileSeq () const |
FILE * | OpenUndoFile (const FlatFilePos &pos, bool fReadOnly=false) const |
Open an undo file (rev?????.dat) More... | |
bool | WriteBlockToDisk (const CBlock &block, FlatFilePos &pos, const CMessageHeader::MessageMagic &messageStart) const |
bool | UndoWriteToDisk (const CBlockUndo &blockundo, FlatFilePos &pos, const BlockHash &hashBlock, const CMessageHeader::MessageMagic &messageStart) const |
void | FindFilesToPruneManual (std::set< int > &setFilesToPrune, int nManualPruneHeight, int chain_tip_height) |
Calculate the block/rev files to delete based on height specified by user with RPC command pruneblockchain. More... | |
void | FindFilesToPrune (std::set< int > &setFilesToPrune, uint64_t nPruneAfterHeight, int chain_tip_height, int prune_height, bool is_ibd) |
Prune block and undo files (blk???.dat and undo???.dat) so that the disk space used is less than a user-defined target. More... | |
std::unordered_map< std::string, PruneLockInfo > m_prune_locks | GUARDED_BY (::cs_main) |
Map from external index name to oldest block that must not be pruned. More... | |
Private Attributes | |
friend | Chainstate |
friend | ChainstateManager |
RecursiveMutex | cs_LastBlockFile |
std::vector< CBlockFileInfo > | m_blockfile_info |
int | m_last_blockfile = 0 |
bool | m_check_for_pruning = false |
Global flag to indicate we should check to see if there are block/undo files that should be deleted. More... | |
const bool | m_prune_mode |
std::set< CBlockIndex * > | m_dirty_blockindex |
Dirty block index entries. More... | |
std::set< int > | m_dirty_fileinfo |
Dirty block file entries. More... | |
const kernel::BlockManagerOpts | m_opts |
Maintains a tree of blocks (stored in m_block_index
) which is consulted to determine where the most-work tip is.
This data is used mostly in Chainstate
- information about, e.g., candidate tips is not maintained here.
Definition at line 74 of file blockstorage.h.
Definition at line 173 of file blockstorage.h.
|
inlineexplicit |
Definition at line 175 of file blockstorage.h.
CBlockIndex * node::BlockManager::AddToBlockIndex | ( | const CBlockHeader & | block, |
CBlockIndex *& | best_header | ||
) |
Remove any pruned block & undo files that are still on disk.
This could happen on some systems if the file was still being read while unlinked, or if we crash before unlinking.
Definition at line 55 of file blockstorage.cpp.
|
private |
uint64_t node::BlockManager::CalculateCurrentUsage | ( | ) |
Calculate the amount of disk space the block & undo files currently use.
Definition at line 568 of file blockstorage.cpp.
void node::BlockManager::CleanupBlockRevFiles | ( | ) | const |
|
private |
|
private |
Prune block and undo files (blk???.dat and undo???.dat) so that the disk space used is less than a user-defined target.
The user sets the target (in MB) on the command line or in config file. This will be run on startup and whenever new space is allocated in a block or undo file, staying below the target. Changing back to unpruned requires a reindex (which in this case means the blockchain must be re-downloaded.)
Pruning functions are called from FlushStateToDisk when the m_check_for_pruning flag has been set. Block and undo files are deleted in lock-step (when blk00003.dat is deleted, so is rev00003.dat.) Pruning cannot take place until the longest chain is at least a certain length (CChainParams::nPruneAfterHeight). Pruning will never delete a block within a defined distance (currently 288) from the active chain's tip. The block index is updated by unsetting HAVE_DATA and HAVE_UNDO for any blocks that were stored in the deleted files. A db flag records the fact that at least some block files have been pruned.
[out] | setFilesToPrune | The set of file indices that can be unlinked will be returned |
Definition at line 157 of file blockstorage.cpp.
|
private |
Calculate the block/rev files to delete based on height specified by user with RPC command pruneblockchain.
Definition at line 129 of file blockstorage.cpp.
|
private |
|
private |
Definition at line 541 of file blockstorage.cpp.
|
private |
Definition at line 532 of file blockstorage.cpp.
CBlockFileInfo * node::BlockManager::GetBlockFileInfo | ( | size_t | n | ) |
Get block file info entry for one block file.
Definition at line 462 of file blockstorage.cpp.
fs::path node::BlockManager::GetBlockPosFilename | ( | const FlatFilePos & | pos | ) | const |
Translation to a filesystem path.
Definition at line 615 of file blockstorage.cpp.
|
inlineprivate |
Definition at line 80 of file blockstorage.h.
const CBlockIndex * node::BlockManager::GetLastCheckpoint | ( | const CCheckpointData & | data | ) |
Returns last CBlockIndex* that is a checkpoint.
Definition at line 391 of file blockstorage.cpp.
|
inlineprivate |
Definition at line 79 of file blockstorage.h.
|
inline |
Attempt to stay below this number of bytes of block files.
Definition at line 238 of file blockstorage.h.
|
private |
Map from external index name to oldest block that must not be pruned.
std::unique_ptr< CBlockTreeDB > m_block_tree_db node::BlockManager::GUARDED_BY | ( | ::cs_main | ) |
CBlockIndex * node::BlockManager::InsertBlockIndex | ( | const BlockHash & | hash | ) |
Create a new block index entry for a given block hash.
Definition at line 232 of file blockstorage.cpp.
|
inline |
Whether running in -prune mode.
Definition at line 235 of file blockstorage.h.
|
private |
Load the blocktree off disk and into memory.
Populate certain metadata per index entry (nStatus, nChainWork, nTimeMax, etc.) as well as peripheral collections like m_dirty_blockindex.
Definition at line 247 of file blockstorage.cpp.
|
inline |
const CBlockIndex * node::BlockManager::LookupBlockIndex | ( | const BlockHash & | hash | ) | const |
CBlockIndex * node::BlockManager::LookupBlockIndex | ( | const BlockHash & | hash | ) |
Definition at line 43 of file blockstorage.cpp.
|
private |
Open an undo file (rev?????.dat)
Definition at line 611 of file blockstorage.cpp.
void node::BlockManager::PruneOneBlockFile | ( | const int | fileNumber | ) |
Mark one block file as pruned (modify associated database entries)
Definition at line 96 of file blockstorage.cpp.
bool node::BlockManager::ReadBlockFromDisk | ( | CBlock & | block, |
const CBlockIndex & | index | ||
) | const |
bool node::BlockManager::ReadBlockFromDisk | ( | CBlock & | block, |
const FlatFilePos & | pos | ||
) | const |
Functions for disk access for blocks.
Definition at line 783 of file blockstorage.cpp.
bool node::BlockManager::ReadTxFromDisk | ( | CMutableTransaction & | tx, |
const FlatFilePos & | pos | ||
) | const |
Functions for disk access for txs.
Definition at line 828 of file blockstorage.cpp.
bool node::BlockManager::ReadTxUndoFromDisk | ( | CTxUndo & | tx, |
const FlatFilePos & | pos | ||
) | const |
|
inline |
|
private |
bool node::BlockManager::UndoReadFromDisk | ( | CBlockUndo & | blockundo, |
const CBlockIndex & | index | ||
) | const |
Definition at line 498 of file blockstorage.cpp.
|
private |
void node::BlockManager::UnlinkPrunedFiles | ( | const std::set< int > & | setFilesToPrune | ) | const |
Actually unlink the specified files.
Definition at line 579 of file blockstorage.cpp.
|
private |
|
private |
Definition at line 75 of file blockstorage.h.
|
private |
Definition at line 76 of file blockstorage.h.
|
private |
Definition at line 142 of file blockstorage.h.
|
private |
Definition at line 143 of file blockstorage.h.
std::vector<CBlockIndex *> GetAllBlockIndices () EXCLUSIVE_LOCKS_REQUIRED( std::multimap<CBlockIndex *, CBlockIndex *> node::BlockManager::m_blocks_unlinked |
All pairs A->B, where A (or one of its ancestors) misses transactions, but B has transactions.
Pruned nodes may have entries where B is missing data.
Definition at line 190 of file blockstorage.h.
|
private |
Global flag to indicate we should check to see if there are block/undo files that should be deleted.
Set on startup or if we allocate more file space when we're in prune mode
Definition at line 150 of file blockstorage.h.
|
private |
Dirty block index entries.
Definition at line 155 of file blockstorage.h.
|
private |
Dirty block file entries.
Definition at line 158 of file blockstorage.h.
const CBlockIndex* GetFirstStoredBlock (const CBlockIndex &start_block) EXCLUSIVE_LOCKS_REQUIRED( bool node::BlockManager::m_have_pruned = false |
Find the first block that is not pruned.
True if any block files have ever been pruned.
Definition at line 264 of file blockstorage.h.
std::atomic<bool> node::BlockManager::m_importing {false} |
Definition at line 178 of file blockstorage.h.
|
private |
Definition at line 144 of file blockstorage.h.
|
private |
Definition at line 170 of file blockstorage.h.
|
private |
Definition at line 152 of file blockstorage.h.
FILE * node::BlockManager::OpenBlockFile |
Check whether the block associated with this index entry is pruned or not.
Create or update a prune lock identified by its name Open a block file (blk?????.dat)
Definition at line 277 of file blockstorage.h.
|
staticconstexpr |
Definition at line 241 of file blockstorage.h.
FlatFilePos node::BlockManager::SaveBlockToDisk |
Store block on disk.
If dbp is not nullptr, then it provides the known position of the block within a block file on disk.
Definition at line 231 of file blockstorage.h.