Add internal interfaces for prune locks

Including desc member of PruneLockInfo for a human-readable description
This commit is contained in:
Luke Dashjr 2021-07-07 00:02:16 +00:00
parent 1ebacb60f8
commit 55fc577c9a
4 changed files with 36 additions and 0 deletions

View File

@ -34,6 +34,7 @@ struct CBlockLocator;
struct FeeCalculation; struct FeeCalculation;
namespace node { namespace node {
struct NodeContext; struct NodeContext;
struct PruneLockInfo;
} // namespace node } // namespace node
namespace interfaces { namespace interfaces {
@ -148,6 +149,10 @@ public:
//! pruned), and contains transactions. //! pruned), and contains transactions.
virtual bool haveBlockOnDisk(int height) = 0; virtual bool haveBlockOnDisk(int height) = 0;
virtual bool pruneLockExists(const std::string& name) const = 0;
virtual void updatePruneLock(const std::string& name, const node::PruneLockInfo& lock_info) = 0;
virtual void deletePruneLock(const std::string& name) = 0;
//! Get locator for the current chain tip. //! Get locator for the current chain tip.
virtual CBlockLocator getTipLocator() = 0; virtual CBlockLocator getTipLocator() = 0;

View File

@ -403,11 +403,21 @@ void BlockManager::FindFilesToPrune(
min_block_to_prune, last_block_can_prune, count); min_block_to_prune, last_block_can_prune, count);
} }
bool BlockManager::PruneLockExists(const std::string& name) const {
return m_prune_locks.count(name);
}
void BlockManager::UpdatePruneLock(const std::string& name, const PruneLockInfo& lock_info) { void BlockManager::UpdatePruneLock(const std::string& name, const PruneLockInfo& lock_info) {
AssertLockHeld(::cs_main); AssertLockHeld(::cs_main);
m_prune_locks[name] = lock_info; m_prune_locks[name] = lock_info;
} }
void BlockManager::DeletePruneLock(const std::string& name)
{
AssertLockHeld(::cs_main);
m_prune_locks.erase(name);
}
CBlockIndex* BlockManager::InsertBlockIndex(const uint256& hash) CBlockIndex* BlockManager::InsertBlockIndex(const uint256& hash)
{ {
AssertLockHeld(cs_main); AssertLockHeld(cs_main);

View File

@ -92,6 +92,7 @@ struct CBlockIndexHeightOnlyComparator {
}; };
struct PruneLockInfo { struct PruneLockInfo {
std::string desc; //! Arbitrary human-readable description of the lock purpose
int height_first{std::numeric_limits<int>::max()}; //! Height of earliest block that should be kept and not pruned int height_first{std::numeric_limits<int>::max()}; //! Height of earliest block that should be kept and not pruned
int height_last{std::numeric_limits<int>::max()}; //! Height of latest block that should be kept and not pruned int height_last{std::numeric_limits<int>::max()}; //! Height of latest block that should be kept and not pruned
}; };
@ -409,8 +410,10 @@ public:
//! Check whether the block associated with this index entry is pruned or not. //! Check whether the block associated with this index entry is pruned or not.
bool IsBlockPruned(const CBlockIndex& block) const EXCLUSIVE_LOCKS_REQUIRED(::cs_main); bool IsBlockPruned(const CBlockIndex& block) const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
bool PruneLockExists(const std::string& name) const SHARED_LOCKS_REQUIRED(::cs_main);
//! Create or update a prune lock identified by its name //! Create or update a prune lock identified by its name
void UpdatePruneLock(const std::string& name, const PruneLockInfo& lock_info) EXCLUSIVE_LOCKS_REQUIRED(::cs_main); void UpdatePruneLock(const std::string& name, const PruneLockInfo& lock_info) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
void DeletePruneLock(const std::string& name) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
/** Open a block file (blk?????.dat) */ /** Open a block file (blk?????.dat) */
AutoFile OpenBlockFile(const FlatFilePos& pos, bool fReadOnly = false) const; AutoFile OpenBlockFile(const FlatFilePos& pos, bool fReadOnly = false) const;

View File

@ -554,6 +554,24 @@ public:
const CBlockIndex* block{chainman().ActiveChain()[height]}; const CBlockIndex* block{chainman().ActiveChain()[height]};
return block && ((block->nStatus & BLOCK_HAVE_DATA) != 0) && block->nTx > 0; return block && ((block->nStatus & BLOCK_HAVE_DATA) != 0) && block->nTx > 0;
} }
bool pruneLockExists(const std::string& name) const override
{
LOCK(cs_main);
auto& blockman = m_node.chainman->m_blockman;
return blockman.PruneLockExists(name);
}
void updatePruneLock(const std::string& name, const node::PruneLockInfo& lock_info) override
{
LOCK(cs_main);
auto& blockman = m_node.chainman->m_blockman;
blockman.UpdatePruneLock(name, lock_info);
}
void deletePruneLock(const std::string& name) override
{
LOCK(cs_main);
auto& blockman = m_node.chainman->m_blockman;
blockman.DeletePruneLock(name);
}
CBlockLocator getTipLocator() override CBlockLocator getTipLocator() override
{ {
LOCK(::cs_main); LOCK(::cs_main);