mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-03 09:56:38 -05:00
indexes, refactor: Remove CBlockIndex* uses in index Rewind methods
Replace Rewind method with CustomRewind and pass block hashes and heights instead of CBlockIndex* pointers This commit does not change behavior in any way.
This commit is contained in:
parent
dc971be083
commit
ee3a079fab
6 changed files with 19 additions and 15 deletions
|
@ -230,6 +230,10 @@ bool BaseIndex::Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_ti
|
||||||
assert(current_tip == m_best_block_index);
|
assert(current_tip == m_best_block_index);
|
||||||
assert(current_tip->GetAncestor(new_tip->nHeight) == new_tip);
|
assert(current_tip->GetAncestor(new_tip->nHeight) == new_tip);
|
||||||
|
|
||||||
|
if (!CustomRewind({current_tip->GetBlockHash(), current_tip->nHeight}, {new_tip->GetBlockHash(), new_tip->nHeight})) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// In the case of a reorg, ensure persisted block locator is not stale.
|
// In the case of a reorg, ensure persisted block locator is not stale.
|
||||||
// Pruning has a minimum of 288 blocks-to-keep and getting the index
|
// Pruning has a minimum of 288 blocks-to-keep and getting the index
|
||||||
// out of sync may be possible but a users fault.
|
// out of sync may be possible but a users fault.
|
||||||
|
|
|
@ -83,6 +83,9 @@ private:
|
||||||
/// getting corrupted.
|
/// getting corrupted.
|
||||||
bool Commit();
|
bool Commit();
|
||||||
|
|
||||||
|
/// Loop over disconnected blocks and call CustomRewind.
|
||||||
|
bool Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_tip);
|
||||||
|
|
||||||
virtual bool AllowPrune() const = 0;
|
virtual bool AllowPrune() const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -105,7 +108,7 @@ protected:
|
||||||
|
|
||||||
/// Rewind index to an earlier chain tip during a chain reorg. The tip must
|
/// Rewind index to an earlier chain tip during a chain reorg. The tip must
|
||||||
/// be an ancestor of the current best block.
|
/// be an ancestor of the current best block.
|
||||||
virtual bool Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_tip);
|
[[nodiscard]] virtual bool CustomRewind(const interfaces::BlockKey& current_tip, const interfaces::BlockKey& new_tip) { return true; }
|
||||||
|
|
||||||
virtual DB& GetDB() const = 0;
|
virtual DB& GetDB() const = 0;
|
||||||
|
|
||||||
|
|
|
@ -287,17 +287,15 @@ static bool CopyHeightIndexToHashIndex(CDBIterator& db_it, CDBBatch& batch,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BlockFilterIndex::Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_tip)
|
bool BlockFilterIndex::CustomRewind(const interfaces::BlockKey& current_tip, const interfaces::BlockKey& new_tip)
|
||||||
{
|
{
|
||||||
assert(current_tip->GetAncestor(new_tip->nHeight) == new_tip);
|
|
||||||
|
|
||||||
CDBBatch batch(*m_db);
|
CDBBatch batch(*m_db);
|
||||||
std::unique_ptr<CDBIterator> db_it(m_db->NewIterator());
|
std::unique_ptr<CDBIterator> db_it(m_db->NewIterator());
|
||||||
|
|
||||||
// During a reorg, we need to copy all filters for blocks that are getting disconnected from the
|
// During a reorg, we need to copy all filters for blocks that are getting disconnected from the
|
||||||
// height index to the hash index so we can still find them when the height index entries are
|
// height index to the hash index so we can still find them when the height index entries are
|
||||||
// overwritten.
|
// overwritten.
|
||||||
if (!CopyHeightIndexToHashIndex(*db_it, batch, m_name, new_tip->nHeight, current_tip->nHeight)) {
|
if (!CopyHeightIndexToHashIndex(*db_it, batch, m_name, new_tip.height, current_tip.height)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,7 +305,7 @@ bool BlockFilterIndex::Rewind(const CBlockIndex* current_tip, const CBlockIndex*
|
||||||
batch.Write(DB_FILTER_POS, m_next_filter_pos);
|
batch.Write(DB_FILTER_POS, m_next_filter_pos);
|
||||||
if (!m_db->WriteBatch(batch)) return false;
|
if (!m_db->WriteBatch(batch)) return false;
|
||||||
|
|
||||||
return BaseIndex::Rewind(current_tip, new_tip);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool LookupOne(const CDBWrapper& db, const CBlockIndex* block_index, DBVal& result)
|
static bool LookupOne(const CDBWrapper& db, const CBlockIndex* block_index, DBVal& result)
|
||||||
|
|
|
@ -47,7 +47,7 @@ protected:
|
||||||
|
|
||||||
bool CustomAppend(const interfaces::BlockInfo& block) override;
|
bool CustomAppend(const interfaces::BlockInfo& block) override;
|
||||||
|
|
||||||
bool Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_tip) override;
|
bool CustomRewind(const interfaces::BlockKey& current_tip, const interfaces::BlockKey& new_tip) override;
|
||||||
|
|
||||||
BaseIndex::DB& GetDB() const override { return *m_db; }
|
BaseIndex::DB& GetDB() const override { return *m_db; }
|
||||||
|
|
||||||
|
|
|
@ -265,17 +265,15 @@ static bool CopyHeightIndexToHashIndex(CDBIterator& db_it, CDBBatch& batch,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CoinStatsIndex::Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_tip)
|
bool CoinStatsIndex::CustomRewind(const interfaces::BlockKey& current_tip, const interfaces::BlockKey& new_tip)
|
||||||
{
|
{
|
||||||
assert(current_tip->GetAncestor(new_tip->nHeight) == new_tip);
|
|
||||||
|
|
||||||
CDBBatch batch(*m_db);
|
CDBBatch batch(*m_db);
|
||||||
std::unique_ptr<CDBIterator> db_it(m_db->NewIterator());
|
std::unique_ptr<CDBIterator> db_it(m_db->NewIterator());
|
||||||
|
|
||||||
// During a reorg, we need to copy all hash digests for blocks that are
|
// During a reorg, we need to copy all hash digests for blocks that are
|
||||||
// getting disconnected from the height index to the hash index so we can
|
// getting disconnected from the height index to the hash index so we can
|
||||||
// still find them when the height index entries are overwritten.
|
// still find them when the height index entries are overwritten.
|
||||||
if (!CopyHeightIndexToHashIndex(*db_it, batch, m_name, new_tip->nHeight, current_tip->nHeight)) {
|
if (!CopyHeightIndexToHashIndex(*db_it, batch, m_name, new_tip.height, current_tip.height)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -283,7 +281,8 @@ bool CoinStatsIndex::Rewind(const CBlockIndex* current_tip, const CBlockIndex* n
|
||||||
|
|
||||||
{
|
{
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
const CBlockIndex* iter_tip{m_chainstate->m_blockman.LookupBlockIndex(current_tip->GetBlockHash())};
|
const CBlockIndex* iter_tip{m_chainstate->m_blockman.LookupBlockIndex(current_tip.hash)};
|
||||||
|
const CBlockIndex* new_tip_index{m_chainstate->m_blockman.LookupBlockIndex(new_tip.hash)};
|
||||||
const auto& consensus_params{Params().GetConsensus()};
|
const auto& consensus_params{Params().GetConsensus()};
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -297,10 +296,10 @@ bool CoinStatsIndex::Rewind(const CBlockIndex* current_tip, const CBlockIndex* n
|
||||||
ReverseBlock(block, iter_tip);
|
ReverseBlock(block, iter_tip);
|
||||||
|
|
||||||
iter_tip = iter_tip->GetAncestor(iter_tip->nHeight - 1);
|
iter_tip = iter_tip->GetAncestor(iter_tip->nHeight - 1);
|
||||||
} while (new_tip != iter_tip);
|
} while (new_tip_index != iter_tip);
|
||||||
}
|
}
|
||||||
|
|
||||||
return BaseIndex::Rewind(current_tip, new_tip);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool LookUpOne(const CDBWrapper& db, const interfaces::BlockKey& block, DBVal& result)
|
static bool LookUpOne(const CDBWrapper& db, const interfaces::BlockKey& block, DBVal& result)
|
||||||
|
|
|
@ -45,7 +45,7 @@ protected:
|
||||||
|
|
||||||
bool CustomAppend(const interfaces::BlockInfo& block) override;
|
bool CustomAppend(const interfaces::BlockInfo& block) override;
|
||||||
|
|
||||||
bool Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_tip) override;
|
bool CustomRewind(const interfaces::BlockKey& current_tip, const interfaces::BlockKey& new_tip) override;
|
||||||
|
|
||||||
BaseIndex::DB& GetDB() const override { return *m_db; }
|
BaseIndex::DB& GetDB() const override { return *m_db; }
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue