mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-16 13:01:19 +02:00
Merge 723f1c669f into merged_master (Bitcoin PR bitcoin/bitcoin#28218)
This commit is contained in:
commit
f95cdcb6d6
14 changed files with 80 additions and 67 deletions
|
|
@ -288,8 +288,9 @@ static void LimitMempoolSize(CTxMemPool& pool, CCoinsViewCache& coins_cache)
|
|||
static bool IsCurrentForFeeEstimation(Chainstate& active_chainstate) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||
{
|
||||
AssertLockHeld(cs_main);
|
||||
if (active_chainstate.IsInitialBlockDownload())
|
||||
if (active_chainstate.m_chainman.IsInitialBlockDownload()) {
|
||||
return false;
|
||||
}
|
||||
if (active_chainstate.m_chain.Tip()->GetBlockTime() < count_seconds(GetTime<std::chrono::seconds>() - MAX_FEE_ESTIMATION_TIP_AGE))
|
||||
return false;
|
||||
if (active_chainstate.m_chain.Height() < active_chainstate.m_chainman.m_best_header->nHeight - 1) {
|
||||
|
|
@ -1722,7 +1723,7 @@ void Chainstate::InitCoinsCache(size_t cache_size_bytes)
|
|||
// `const` so that `CValidationInterface` clients (which are given a `const Chainstate*`)
|
||||
// can call it.
|
||||
//
|
||||
bool Chainstate::IsInitialBlockDownload() const
|
||||
bool ChainstateManager::IsInitialBlockDownload() const
|
||||
{
|
||||
// Optimization: pre-test latch before taking the lock.
|
||||
if (m_cached_finished_ibd.load(std::memory_order_relaxed))
|
||||
|
|
@ -1731,15 +1732,17 @@ bool Chainstate::IsInitialBlockDownload() const
|
|||
LOCK(cs_main);
|
||||
if (m_cached_finished_ibd.load(std::memory_order_relaxed))
|
||||
return false;
|
||||
if (m_chainman.m_blockman.LoadingBlocks()) {
|
||||
if (m_blockman.LoadingBlocks()) {
|
||||
return true;
|
||||
}
|
||||
if (m_chain.Tip() == nullptr)
|
||||
return true;
|
||||
if (m_chain.Tip()->nChainWork < m_chainman.MinimumChainWork()) {
|
||||
CChain& chain{ActiveChain()};
|
||||
if (chain.Tip() == nullptr) {
|
||||
return true;
|
||||
}
|
||||
if (m_chain.Tip()->Time() < Now<NodeSeconds>() - m_chainman.m_options.max_tip_age) {
|
||||
if (chain.Tip()->nChainWork < MinimumChainWork()) {
|
||||
return true;
|
||||
}
|
||||
if (chain.Tip()->Time() < Now<NodeSeconds>() - m_options.max_tip_age) {
|
||||
return true;
|
||||
}
|
||||
LogPrintf("Leaving InitialBlockDownload (latching to false)\n");
|
||||
|
|
@ -1753,7 +1756,7 @@ void Chainstate::CheckForkWarningConditions()
|
|||
|
||||
// Before we get past initial download, we cannot reliably alert about forks
|
||||
// (we assume we don't get stuck on a fork before finishing our initial sync)
|
||||
if (IsInitialBlockDownload()) {
|
||||
if (m_chainman.IsInitialBlockDownload()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2712,7 +2715,7 @@ bool Chainstate::FlushStateToDisk(
|
|||
} else {
|
||||
LOG_TIME_MILLIS_WITH_CATEGORY("find files to prune", BCLog::BENCH);
|
||||
|
||||
m_blockman.FindFilesToPrune(setFilesToPrune, m_chainman.GetParams().PruneAfterHeight(), m_chain.Height(), last_prune, IsInitialBlockDownload());
|
||||
m_blockman.FindFilesToPrune(setFilesToPrune, m_chainman.GetParams().PruneAfterHeight(), m_chain.Height(), last_prune, m_chainman.IsInitialBlockDownload());
|
||||
m_blockman.m_check_for_pruning = false;
|
||||
}
|
||||
if (!setFilesToPrune.empty()) {
|
||||
|
|
@ -2935,7 +2938,7 @@ void Chainstate::UpdateTip(const CBlockIndex* pindexNew)
|
|||
}
|
||||
|
||||
bilingual_str warning_messages;
|
||||
if (!this->IsInitialBlockDownload()) {
|
||||
if (!m_chainman.IsInitialBlockDownload()) {
|
||||
const CBlockIndex* pindex = pindexNew;
|
||||
for (int bit = 0; bit < VERSIONBITS_NUM_BITS; bit++) {
|
||||
WarningBitsConditionChecker checker(m_chainman, bit);
|
||||
|
|
@ -3381,24 +3384,25 @@ static SynchronizationState GetSynchronizationState(bool init)
|
|||
return SynchronizationState::INIT_DOWNLOAD;
|
||||
}
|
||||
|
||||
static bool NotifyHeaderTip(Chainstate& chainstate) LOCKS_EXCLUDED(cs_main) {
|
||||
static bool NotifyHeaderTip(ChainstateManager& chainman) LOCKS_EXCLUDED(cs_main)
|
||||
{
|
||||
bool fNotify = false;
|
||||
bool fInitialBlockDownload = false;
|
||||
static CBlockIndex* pindexHeaderOld = nullptr;
|
||||
CBlockIndex* pindexHeader = nullptr;
|
||||
{
|
||||
LOCK(cs_main);
|
||||
pindexHeader = chainstate.m_chainman.m_best_header;
|
||||
pindexHeader = chainman.m_best_header;
|
||||
|
||||
if (pindexHeader != pindexHeaderOld) {
|
||||
fNotify = true;
|
||||
fInitialBlockDownload = chainstate.IsInitialBlockDownload();
|
||||
fInitialBlockDownload = chainman.IsInitialBlockDownload();
|
||||
pindexHeaderOld = pindexHeader;
|
||||
}
|
||||
}
|
||||
// Send block tip changed notifications without cs_main
|
||||
if (fNotify) {
|
||||
chainstate.m_chainman.GetNotifications().headerTip(GetSynchronizationState(fInitialBlockDownload), pindexHeader->nHeight, pindexHeader->nTime, false);
|
||||
chainman.GetNotifications().headerTip(GetSynchronizationState(fInitialBlockDownload), pindexHeader->nHeight, pindexHeader->nTime, false);
|
||||
}
|
||||
return fNotify;
|
||||
}
|
||||
|
|
@ -3504,7 +3508,7 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
|
|||
if (!blocks_connected) return true;
|
||||
|
||||
const CBlockIndex* pindexFork = m_chain.FindFork(starting_tip);
|
||||
bool fInitialDownload = IsInitialBlockDownload();
|
||||
bool fInitialDownload = m_chainman.IsInitialBlockDownload();
|
||||
|
||||
// Notify external listeners about the new tip.
|
||||
// Enqueue while holding cs_main to ensure that UpdatedBlockTip is called in the order in which blocks are connected
|
||||
|
|
@ -3727,7 +3731,7 @@ bool Chainstate::InvalidateBlock(BlockValidationState& state, CBlockIndex* pinde
|
|||
// parameter indicating the source of the tip change so hooks can
|
||||
// distinguish user-initiated invalidateblock changes from other
|
||||
// changes.
|
||||
(void)m_chainman.GetNotifications().blockTip(GetSynchronizationState(IsInitialBlockDownload()), *to_mark_failed->pprev);
|
||||
(void)m_chainman.GetNotifications().blockTip(GetSynchronizationState(m_chainman.IsInitialBlockDownload()), *to_mark_failed->pprev);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -4341,7 +4345,7 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
|
|||
const auto msg = strprintf(
|
||||
"Saw new header hash=%s height=%d", hash.ToString(), pindex->nHeight);
|
||||
|
||||
if (ActiveChainstate().IsInitialBlockDownload()) {
|
||||
if (IsInitialBlockDownload()) {
|
||||
LogPrintLevel(BCLog::VALIDATION, BCLog::Level::Debug, "%s\n", msg);
|
||||
} else {
|
||||
LogPrintf("%s\n", msg);
|
||||
|
|
@ -4376,8 +4380,8 @@ bool ChainstateManager::ProcessNewBlockHeaders(const std::vector<CBlockHeader>&
|
|||
}
|
||||
}
|
||||
}
|
||||
if (NotifyHeaderTip(ActiveChainstate())) {
|
||||
if (ActiveChainstate().IsInitialBlockDownload() && ppindex && *ppindex) {
|
||||
if (NotifyHeaderTip(*this)) {
|
||||
if (IsInitialBlockDownload() && ppindex && *ppindex) {
|
||||
const CBlockIndex& last_accepted{**ppindex};
|
||||
const int64_t blocks_left{(GetTime() - last_accepted.GetBlockTime()) / GetConsensus().nPowTargetSpacing};
|
||||
const double progress{100.0 * last_accepted.nHeight / (last_accepted.nHeight + blocks_left)};
|
||||
|
|
@ -4390,7 +4394,6 @@ bool ChainstateManager::ProcessNewBlockHeaders(const std::vector<CBlockHeader>&
|
|||
void ChainstateManager::ReportHeadersPresync(const arith_uint256& work, int64_t height, int64_t timestamp)
|
||||
{
|
||||
AssertLockNotHeld(cs_main);
|
||||
const auto& chainstate = ActiveChainstate();
|
||||
{
|
||||
LOCK(cs_main);
|
||||
// Don't report headers presync progress if we already have a post-minchainwork header chain.
|
||||
|
|
@ -4403,7 +4406,7 @@ void ChainstateManager::ReportHeadersPresync(const arith_uint256& work, int64_t
|
|||
if (now < m_last_presync_update + std::chrono::milliseconds{250}) return;
|
||||
m_last_presync_update = now;
|
||||
}
|
||||
bool initial_download = chainstate.IsInitialBlockDownload();
|
||||
bool initial_download = IsInitialBlockDownload();
|
||||
GetNotifications().headerTip(GetSynchronizationState(initial_download), height, timestamp, /*presync=*/true);
|
||||
if (initial_download) {
|
||||
const int64_t blocks_left{(GetTime() - timestamp) / GetConsensus().nPowTargetSpacing};
|
||||
|
|
@ -4477,7 +4480,7 @@ bool ChainstateManager::AcceptBlock(const std::shared_ptr<const CBlock>& pblock,
|
|||
|
||||
// Header is valid/has work, merkle tree and segwit merkle tree are good...RELAY NOW
|
||||
// (but if it does not build on our best tip, let the SendMessages loop relay it)
|
||||
if (!ActiveChainstate().IsInitialBlockDownload() && ActiveTip() == pindex->pprev)
|
||||
if (!IsInitialBlockDownload() && ActiveTip() == pindex->pprev)
|
||||
GetMainSignals().NewPoWValidBlock(pindex, pblock);
|
||||
|
||||
// Write block to history file
|
||||
|
|
@ -4536,7 +4539,7 @@ bool ChainstateManager::ProcessNewBlock(const std::shared_ptr<const CBlock>& blo
|
|||
}
|
||||
}
|
||||
|
||||
NotifyHeaderTip(ActiveChainstate());
|
||||
NotifyHeaderTip(*this);
|
||||
|
||||
BlockValidationState state; // Only used to report errors, not invalidity - ignore it
|
||||
if (!ActiveChainstate().ActivateBestChain(state, block)) {
|
||||
|
|
@ -5104,7 +5107,7 @@ void ChainstateManager::LoadExternalBlockFile(
|
|||
}
|
||||
}
|
||||
|
||||
NotifyHeaderTip(ActiveChainstate());
|
||||
NotifyHeaderTip(*this);
|
||||
|
||||
if (!blocks_with_unknown_parent) continue;
|
||||
|
||||
|
|
@ -5130,7 +5133,7 @@ void ChainstateManager::LoadExternalBlockFile(
|
|||
}
|
||||
range.first++;
|
||||
blocks_with_unknown_parent->erase(it);
|
||||
NotifyHeaderTip(ActiveChainstate());
|
||||
NotifyHeaderTip(*this);
|
||||
}
|
||||
}
|
||||
} catch (const std::exception& e) {
|
||||
|
|
@ -6053,7 +6056,7 @@ void ChainstateManager::MaybeRebalanceCaches()
|
|||
// If both chainstates exist, determine who needs more cache based on IBD status.
|
||||
//
|
||||
// Note: shrink caches first so that we don't inadvertently overwhelm available memory.
|
||||
if (m_snapshot_chainstate->IsInitialBlockDownload()) {
|
||||
if (IsInitialBlockDownload()) {
|
||||
m_ibd_chainstate->ResizeCoinsCaches(
|
||||
m_total_coinstip_cache * 0.05, m_total_coinsdb_cache * 0.05);
|
||||
m_snapshot_chainstate->ResizeCoinsCaches(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue