Bitcoin ABC 0.30.3
P2P Digital Currency
Public Types | Public Member Functions | Public Attributes | Static Public Attributes | Private Member Functions | Private Attributes | List of all members
node::BlockManager Class Reference

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>

Collaboration diagram for node::BlockManager:
[legend]

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(CBlockIndexAddToBlockIndex (const CBlockHeader &block, CBlockIndex *&best_header) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 Remove any pruned block & undo files that are still on disk. More...
 
CBlockIndexInsertBlockIndex (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...
 
CBlockIndexLookupBlockIndex (const BlockHash &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 
const CBlockIndexLookupBlockIndex (const BlockHash &hash) const EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 
CBlockFileInfoGetBlockFileInfo (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 CBlockIndexGetLastCheckpoint (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 CChainParamsGetParams () const
 
const Consensus::ParamsGetConsensus () 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< CBlockFileInfom_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
 

Detailed Description

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.

Member Typedef Documentation

◆ Options

Definition at line 173 of file blockstorage.h.

Constructor & Destructor Documentation

◆ BlockManager()

node::BlockManager::BlockManager ( Options  opts)
inlineexplicit

Definition at line 175 of file blockstorage.h.

Member Function Documentation

◆ AddToBlockIndex()

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.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ BlockFileSeq()

FlatFileSeq node::BlockManager::BlockFileSeq ( ) const
private

Definition at line 595 of file blockstorage.cpp.

Here is the caller graph for this function:

◆ CalculateCurrentUsage()

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.

Here is the caller graph for this function:

◆ CleanupBlockRevFiles()

void node::BlockManager::CleanupBlockRevFiles ( ) const

Definition at line 428 of file blockstorage.cpp.

Here is the call graph for this function:

◆ FindBlockPos()

bool node::BlockManager::FindBlockPos ( FlatFilePos pos,
unsigned int  nAddSize,
unsigned int  nHeight,
CChain active_chain,
uint64_t  nTime,
bool  fKnown 
)
private

Definition at line 619 of file blockstorage.cpp.

Here is the call graph for this function:

◆ FindFilesToPrune()

void node::BlockManager::FindFilesToPrune ( std::set< int > &  setFilesToPrune,
uint64_t  nPruneAfterHeight,
int  chain_tip_height,
int  prune_height,
bool  is_ibd 
)
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.

Parameters
[out]setFilesToPruneThe set of file indices that can be unlinked will be returned

Definition at line 157 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FindFilesToPruneManual()

void node::BlockManager::FindFilesToPruneManual ( std::set< int > &  setFilesToPrune,
int  nManualPruneHeight,
int  chain_tip_height 
)
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.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FindUndoPos()

bool node::BlockManager::FindUndoPos ( BlockValidationState state,
int  nFile,
FlatFilePos pos,
unsigned int  nAddSize 
)
private

Definition at line 697 of file blockstorage.cpp.

Here is the call graph for this function:

◆ FlushBlockFile()

void node::BlockManager::FlushBlockFile ( bool  fFinalize = false,
bool  finalize_undo = false 
)
private

Definition at line 541 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FlushUndoFile()

void node::BlockManager::FlushUndoFile ( int  block_file,
bool  finalize = false 
)
private

Definition at line 532 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetBlockFileInfo()

CBlockFileInfo * node::BlockManager::GetBlockFileInfo ( size_t  n)

Get block file info entry for one block file.

Definition at line 462 of file blockstorage.cpp.

◆ GetBlockPosFilename()

fs::path node::BlockManager::GetBlockPosFilename ( const FlatFilePos pos) const

Translation to a filesystem path.

Definition at line 615 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetConsensus()

const Consensus::Params & node::BlockManager::GetConsensus ( ) const
inlineprivate

Definition at line 80 of file blockstorage.h.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetLastCheckpoint()

const CBlockIndex * node::BlockManager::GetLastCheckpoint ( const CCheckpointData data)

Returns last CBlockIndex* that is a checkpoint.

Definition at line 391 of file blockstorage.cpp.

Here is the call graph for this function:

◆ GetParams()

const CChainParams & node::BlockManager::GetParams ( ) const
inlineprivate

Definition at line 79 of file blockstorage.h.

◆ GetPruneTarget()

uint64_t node::BlockManager::GetPruneTarget ( ) const
inline

Attempt to stay below this number of bytes of block files.

Definition at line 238 of file blockstorage.h.

Here is the caller graph for this function:

◆ GUARDED_BY() [1/3]

std::unordered_map< std::string, PruneLockInfo > m_prune_locks node::BlockManager::GUARDED_BY ( ::cs_main  )
private

Map from external index name to oldest block that must not be pruned.

Note
Internally, only blocks at height (height_first - PRUNE_LOCK_BUFFER - 1) and below will be pruned, but callers should avoid assuming any particular buffer size.

◆ GUARDED_BY() [2/3]

std::unique_ptr< CBlockTreeDB > m_block_tree_db node::BlockManager::GUARDED_BY ( ::cs_main  )

◆ GUARDED_BY() [3/3]

BlockMap m_block_index node::BlockManager::GUARDED_BY ( cs_main  )

◆ InsertBlockIndex()

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.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsPruneMode()

bool node::BlockManager::IsPruneMode ( ) const
inline

Whether running in -prune mode.

Definition at line 235 of file blockstorage.h.

Here is the caller graph for this function:

◆ LoadBlockIndex()

bool node::BlockManager::LoadBlockIndex ( )
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.

Here is the call graph for this function:

◆ LoadingBlocks()

bool node::BlockManager::LoadingBlocks ( ) const
inline

Definition at line 244 of file blockstorage.h.

Here is the caller graph for this function:

◆ LookupBlockIndex() [1/2]

const CBlockIndex * node::BlockManager::LookupBlockIndex ( const BlockHash hash) const

Definition at line 49 of file blockstorage.cpp.

Here is the call graph for this function:

◆ LookupBlockIndex() [2/2]

CBlockIndex * node::BlockManager::LookupBlockIndex ( const BlockHash hash)

Definition at line 43 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OpenUndoFile()

FILE * node::BlockManager::OpenUndoFile ( const FlatFilePos pos,
bool  fReadOnly = false 
) const
private

Open an undo file (rev?????.dat)

Definition at line 611 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PruneOneBlockFile()

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.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ReadBlockFromDisk() [1/2]

bool node::BlockManager::ReadBlockFromDisk ( CBlock block,
const CBlockIndex index 
) const

Definition at line 811 of file blockstorage.cpp.

Here is the call graph for this function:

◆ ReadBlockFromDisk() [2/2]

bool node::BlockManager::ReadBlockFromDisk ( CBlock block,
const FlatFilePos pos 
) const

Functions for disk access for blocks.

Definition at line 783 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ReadTxFromDisk()

bool node::BlockManager::ReadTxFromDisk ( CMutableTransaction tx,
const FlatFilePos pos 
) const

Functions for disk access for txs.

Definition at line 828 of file blockstorage.cpp.

Here is the call graph for this function:

◆ ReadTxUndoFromDisk()

bool node::BlockManager::ReadTxUndoFromDisk ( CTxUndo tx,
const FlatFilePos pos 
) const

Definition at line 848 of file blockstorage.cpp.

Here is the call graph for this function:

◆ StopAfterBlockImport()

bool node::BlockManager::StopAfterBlockImport ( ) const
inline

Definition at line 246 of file blockstorage.h.

Here is the caller graph for this function:

◆ UndoFileSeq()

FlatFileSeq node::BlockManager::UndoFileSeq ( ) const
private

Definition at line 601 of file blockstorage.cpp.

Here is the caller graph for this function:

◆ UndoReadFromDisk()

bool node::BlockManager::UndoReadFromDisk ( CBlockUndo blockundo,
const CBlockIndex index 
) const

Definition at line 498 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UndoWriteToDisk()

bool node::BlockManager::UndoWriteToDisk ( const CBlockUndo blockundo,
FlatFilePos pos,
const BlockHash hashBlock,
const CMessageHeader::MessageMagic messageStart 
) const
private

Definition at line 468 of file blockstorage.cpp.

Here is the call graph for this function:

◆ UnlinkPrunedFiles()

void node::BlockManager::UnlinkPrunedFiles ( const std::set< int > &  setFilesToPrune) const

Actually unlink the specified files.

Definition at line 579 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ WriteBlockToDisk()

bool node::BlockManager::WriteBlockToDisk ( const CBlock block,
FlatFilePos pos,
const CMessageHeader::MessageMagic messageStart 
) const
private

Definition at line 721 of file blockstorage.cpp.

Here is the call graph for this function:

Member Data Documentation

◆ Chainstate

friend node::BlockManager::Chainstate
private

Definition at line 75 of file blockstorage.h.

◆ ChainstateManager

friend node::BlockManager::ChainstateManager
private

Definition at line 76 of file blockstorage.h.

◆ cs_LastBlockFile

RecursiveMutex node::BlockManager::cs_LastBlockFile
private

Definition at line 142 of file blockstorage.h.

◆ m_blockfile_info

std::vector<CBlockFileInfo> node::BlockManager::m_blockfile_info
private

Definition at line 143 of file blockstorage.h.

◆ m_blocks_unlinked

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.

◆ m_check_for_pruning

bool node::BlockManager::m_check_for_pruning = false
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.

◆ m_dirty_blockindex

std::set<CBlockIndex *> node::BlockManager::m_dirty_blockindex
private

Dirty block index entries.

Definition at line 155 of file blockstorage.h.

◆ m_dirty_fileinfo

std::set<int> node::BlockManager::m_dirty_fileinfo
private

Dirty block file entries.

Definition at line 158 of file blockstorage.h.

◆ m_have_pruned

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.

◆ m_importing

std::atomic<bool> node::BlockManager::m_importing {false}

Definition at line 178 of file blockstorage.h.

◆ m_last_blockfile

int node::BlockManager::m_last_blockfile = 0
private

Definition at line 144 of file blockstorage.h.

◆ m_opts

const kernel::BlockManagerOpts node::BlockManager::m_opts
private

Definition at line 170 of file blockstorage.h.

◆ m_prune_mode

const bool node::BlockManager::m_prune_mode
private

Definition at line 152 of file blockstorage.h.

◆ OpenBlockFile

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.

◆ PRUNE_TARGET_MANUAL

constexpr auto node::BlockManager::PRUNE_TARGET_MANUAL
staticconstexpr
Initial value:
{
std::numeric_limits<uint64_t>::max()}

Definition at line 241 of file blockstorage.h.

◆ SaveBlockToDisk

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.


The documentation for this class was generated from the following files: