mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 12:32:48 +01:00
partial bitcoin#24138: Commit MuHash and best block together for coinstatsindex
excludes: - 691d45fdc83ec14f87a400f548553168ac70263f (portions)
This commit is contained in:
parent
6f270bbf9b
commit
c21f23db1b
@ -223,10 +223,9 @@ bool CoinStatsIndex::WriteBlock(const CBlock& block, const CBlockIndex* pindex)
|
|||||||
m_muhash.Finalize(out);
|
m_muhash.Finalize(out);
|
||||||
value.second.muhash = out;
|
value.second.muhash = out;
|
||||||
|
|
||||||
CDBBatch batch(*m_db);
|
// Intentionally do not update DB_MUHASH here so it stays in sync with
|
||||||
batch.Write(DBHeightKey(pindex->nHeight), value);
|
// DB_BEST_BLOCK, and the index is not corrupted if there is an unclean shutdown.
|
||||||
batch.Write(DB_MUHASH, m_muhash);
|
return m_db->Write(DBHeightKey(pindex->nHeight), value);
|
||||||
return m_db->WriteBatch(batch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CopyHeightIndexToHashIndex(CDBIterator& db_it, CDBBatch& batch,
|
static bool CopyHeightIndexToHashIndex(CDBIterator& db_it, CDBBatch& batch,
|
||||||
@ -381,6 +380,14 @@ bool CoinStatsIndex::Init()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CoinStatsIndex::CommitInternal(CDBBatch& batch)
|
||||||
|
{
|
||||||
|
// DB_MUHASH should always be committed in a batch together with DB_BEST_BLOCK
|
||||||
|
// to prevent an inconsistent state of the DB.
|
||||||
|
batch.Write(DB_MUHASH, m_muhash);
|
||||||
|
return BaseIndex::CommitInternal(batch);
|
||||||
|
}
|
||||||
|
|
||||||
// Reverse a single block as part of a reorg
|
// Reverse a single block as part of a reorg
|
||||||
bool CoinStatsIndex::ReverseBlock(const CBlock& block, const CBlockIndex* pindex)
|
bool CoinStatsIndex::ReverseBlock(const CBlock& block, const CBlockIndex* pindex)
|
||||||
{
|
{
|
||||||
@ -482,5 +489,5 @@ bool CoinStatsIndex::ReverseBlock(const CBlock& block, const CBlockIndex* pindex
|
|||||||
Assert(m_total_unspendables_scripts == read_out.second.total_unspendables_scripts);
|
Assert(m_total_unspendables_scripts == read_out.second.total_unspendables_scripts);
|
||||||
Assert(m_total_unspendables_unclaimed_rewards == read_out.second.total_unspendables_unclaimed_rewards);
|
Assert(m_total_unspendables_unclaimed_rewards == read_out.second.total_unspendables_unclaimed_rewards);
|
||||||
|
|
||||||
return m_db->Write(DB_MUHASH, m_muhash);
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,8 @@ private:
|
|||||||
protected:
|
protected:
|
||||||
bool Init() override;
|
bool Init() override;
|
||||||
|
|
||||||
|
bool CommitInternal(CDBBatch& batch) override;
|
||||||
|
|
||||||
bool WriteBlock(const CBlock& block, const CBlockIndex* pindex) override;
|
bool WriteBlock(const CBlock& block, const CBlockIndex* pindex) override;
|
||||||
|
|
||||||
bool Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_tip) override;
|
bool Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_tip) override;
|
||||||
|
@ -14,6 +14,17 @@
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE(coinstatsindex_tests)
|
BOOST_AUTO_TEST_SUITE(coinstatsindex_tests)
|
||||||
|
|
||||||
|
static void IndexWaitSynced(BaseIndex& index)
|
||||||
|
{
|
||||||
|
// Allow the CoinStatsIndex to catch up with the block index that is syncing
|
||||||
|
// in a background thread.
|
||||||
|
const auto timeout = GetTime<std::chrono::seconds>() + 120s;
|
||||||
|
while (!index.BlockUntilSyncedToCurrentChain()) {
|
||||||
|
BOOST_REQUIRE(timeout > GetTime<std::chrono::milliseconds>());
|
||||||
|
UninterruptibleSleep(100ms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_CASE(coinstatsindex_initial_sync, TestChain100Setup)
|
BOOST_FIXTURE_TEST_CASE(coinstatsindex_initial_sync, TestChain100Setup)
|
||||||
{
|
{
|
||||||
CoinStatsIndex coin_stats_index{1 << 20, true};
|
CoinStatsIndex coin_stats_index{1 << 20, true};
|
||||||
@ -34,13 +45,7 @@ BOOST_FIXTURE_TEST_CASE(coinstatsindex_initial_sync, TestChain100Setup)
|
|||||||
|
|
||||||
BOOST_REQUIRE(coin_stats_index.Start(::ChainstateActive()));
|
BOOST_REQUIRE(coin_stats_index.Start(::ChainstateActive()));
|
||||||
|
|
||||||
// Allow the CoinStatsIndex to catch up with the block index that is syncing
|
IndexWaitSynced(coin_stats_index);
|
||||||
// in a background thread.
|
|
||||||
const auto timeout = GetTime<std::chrono::seconds>() + 120s;
|
|
||||||
while (!coin_stats_index.BlockUntilSyncedToCurrentChain()) {
|
|
||||||
BOOST_REQUIRE(timeout > GetTime<std::chrono::milliseconds>());
|
|
||||||
UninterruptibleSleep(100ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check that CoinStatsIndex works for genesis block.
|
// Check that CoinStatsIndex works for genesis block.
|
||||||
const CBlockIndex* genesis_block_index;
|
const CBlockIndex* genesis_block_index;
|
||||||
|
Loading…
Reference in New Issue
Block a user