diff --git a/src/chain.h b/src/chain.h index 466276c01a7..e94308aa7f8 100644 --- a/src/chain.h +++ b/src/chain.h @@ -420,6 +420,15 @@ public: return int(vChain.size()) - 1; } + /** Check whether this chain's tip exists, has enough work, and is recent. */ + bool IsTipRecent(const arith_uint256& min_chain_work, std::chrono::seconds max_tip_age) const EXCLUSIVE_LOCKS_REQUIRED(::cs_main) + { + const auto tip{Tip()}; + return tip && + tip->nChainWork >= min_chain_work && + tip->Time() >= Now() - max_tip_age; + } + /** Set/initialize a chain with a given tip. */ void SetTip(CBlockIndex& block); diff --git a/src/kernel/bitcoinkernel.cpp b/src/kernel/bitcoinkernel.cpp index bbcfd66b930..b061a185483 100644 --- a/src/kernel/bitcoinkernel.cpp +++ b/src/kernel/bitcoinkernel.cpp @@ -1054,7 +1054,8 @@ int btck_chainstate_manager_import_blocks(btck_ChainstateManager* chainman, cons import_files.emplace_back(std::string{block_file_paths_data[i], block_file_paths_lens[i]}.c_str()); } } - node::ImportBlocks(*btck_ChainstateManager::get(chainman).m_chainman, import_files); + auto& chainman_ref{*btck_ChainstateManager::get(chainman).m_chainman}; + node::ImportBlocks(chainman_ref, import_files); } catch (const std::exception& e) { LogError("Failed to import blocks: %s", e.what()); return -1; diff --git a/src/validation.cpp b/src/validation.cpp index 3b10237e5ba..1b3b09cbabe 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1947,25 +1947,12 @@ void Chainstate::InitCoinsCache(size_t cache_size_bytes) bool ChainstateManager::IsInitialBlockDownload() const { // Optimization: pre-test latch before taking the lock. - if (!m_cached_is_ibd.load(std::memory_order_relaxed)) - return false; + if (!m_cached_is_ibd.load(std::memory_order_relaxed)) return false; LOCK(cs_main); - if (!m_cached_is_ibd.load(std::memory_order_relaxed)) - return false; - if (m_blockman.LoadingBlocks()) { - return true; - } - CChain& chain{ActiveChain()}; - if (chain.Tip() == nullptr) { - return true; - } - if (chain.Tip()->nChainWork < MinimumChainWork()) { - return true; - } - if (chain.Tip()->Time() < Now() - m_options.max_tip_age) { - return true; - } + if (!m_cached_is_ibd.load(std::memory_order_relaxed)) return false; + if (m_blockman.LoadingBlocks()) return true; + if (!ActiveChain().IsTipRecent(MinimumChainWork(), m_options.max_tip_age)) return true; LogInfo("Leaving InitialBlockDownload (latching to false)"); m_cached_is_ibd.store(false, std::memory_order_relaxed); return false;