Changeset View
Changeset View
Standalone View
Standalone View
src/validation.cpp
Show First 20 Lines • Show All 5,906 Lines • ▼ Show 20 Lines | if (pindex->GetChainTxCount() <= data.nTxCount) { | ||||
fTxTotal = pindex->GetChainTxCount() + | fTxTotal = pindex->GetChainTxCount() + | ||||
(nNow - pindex->GetBlockTime()) * data.dTxRate; | (nNow - pindex->GetBlockTime()) * data.dTxRate; | ||||
} | } | ||||
return std::min<double>(pindex->GetChainTxCount() / fTxTotal, 1.0); | return std::min<double>(pindex->GetChainTxCount() / fTxTotal, 1.0); | ||||
} | } | ||||
std::optional<BlockHash> ChainstateManager::SnapshotBlockhash() const { | std::optional<BlockHash> ChainstateManager::SnapshotBlockhash() const { | ||||
// for m_active_chainstate access | |||||
LOCK(::cs_main); | LOCK(::cs_main); | ||||
if (m_active_chainstate && m_active_chainstate->m_from_snapshot_blockhash) { | if (m_active_chainstate && m_active_chainstate->m_from_snapshot_blockhash) { | ||||
// If a snapshot chainstate exists, it will always be our active. | // If a snapshot chainstate exists, it will always be our active. | ||||
return m_active_chainstate->m_from_snapshot_blockhash; | return m_active_chainstate->m_from_snapshot_blockhash; | ||||
} | } | ||||
return std::nullopt; | return std::nullopt; | ||||
} | } | ||||
std::vector<CChainState *> ChainstateManager::GetAll() { | std::vector<CChainState *> ChainstateManager::GetAll() { | ||||
LOCK(::cs_main); | |||||
std::vector<CChainState *> out; | std::vector<CChainState *> out; | ||||
if (!IsSnapshotValidated() && m_ibd_chainstate) { | if (!IsSnapshotValidated() && m_ibd_chainstate) { | ||||
out.push_back(m_ibd_chainstate.get()); | out.push_back(m_ibd_chainstate.get()); | ||||
} | } | ||||
if (m_snapshot_chainstate) { | if (m_snapshot_chainstate) { | ||||
out.push_back(m_snapshot_chainstate.get()); | out.push_back(m_snapshot_chainstate.get()); | ||||
▲ Show 20 Lines • Show All 315 Lines • ▼ Show 20 Lines | |||||
CChainState &ChainstateManager::ActiveChainstate() const { | CChainState &ChainstateManager::ActiveChainstate() const { | ||||
LOCK(::cs_main); | LOCK(::cs_main); | ||||
assert(m_active_chainstate); | assert(m_active_chainstate); | ||||
return *m_active_chainstate; | return *m_active_chainstate; | ||||
} | } | ||||
bool ChainstateManager::IsSnapshotActive() const { | bool ChainstateManager::IsSnapshotActive() const { | ||||
LOCK(::cs_main); | |||||
return m_snapshot_chainstate && | return m_snapshot_chainstate && | ||||
WITH_LOCK(::cs_main, return m_active_chainstate) == | m_active_chainstate == m_snapshot_chainstate.get(); | ||||
m_snapshot_chainstate.get(); | |||||
} | } | ||||
CChainState &ChainstateManager::ValidatedChainstate() const { | CChainState &ChainstateManager::ValidatedChainstate() const { | ||||
LOCK(::cs_main); | |||||
if (m_snapshot_chainstate && IsSnapshotValidated()) { | if (m_snapshot_chainstate && IsSnapshotValidated()) { | ||||
return *m_snapshot_chainstate.get(); | return *m_snapshot_chainstate.get(); | ||||
} | } | ||||
assert(m_ibd_chainstate); | assert(m_ibd_chainstate); | ||||
return *m_ibd_chainstate.get(); | return *m_ibd_chainstate.get(); | ||||
} | } | ||||
bool ChainstateManager::IsBackgroundIBD(CChainState *chainstate) const { | bool ChainstateManager::IsBackgroundIBD(CChainState *chainstate) const { | ||||
LOCK(::cs_main); | |||||
return (m_snapshot_chainstate && chainstate == m_ibd_chainstate.get()); | return (m_snapshot_chainstate && chainstate == m_ibd_chainstate.get()); | ||||
} | } | ||||
void ChainstateManager::Unload() { | void ChainstateManager::Unload() { | ||||
for (CChainState *chainstate : this->GetAll()) { | for (CChainState *chainstate : this->GetAll()) { | ||||
chainstate->m_chain.SetTip(nullptr); | chainstate->m_chain.SetTip(nullptr); | ||||
chainstate->UnloadBlockIndex(); | chainstate->UnloadBlockIndex(); | ||||
} | } | ||||
m_blockman.Unload(); | m_blockman.Unload(); | ||||
} | } | ||||
void ChainstateManager::Reset() { | void ChainstateManager::Reset() { | ||||
LOCK(::cs_main); | |||||
m_ibd_chainstate.reset(); | m_ibd_chainstate.reset(); | ||||
m_snapshot_chainstate.reset(); | m_snapshot_chainstate.reset(); | ||||
{ | |||||
LOCK(::cs_main); | |||||
m_active_chainstate = nullptr; | m_active_chainstate = nullptr; | ||||
} | |||||
m_snapshot_validated = false; | m_snapshot_validated = false; | ||||
} | } | ||||
void ChainstateManager::MaybeRebalanceCaches() { | void ChainstateManager::MaybeRebalanceCaches() { | ||||
if (m_ibd_chainstate && !m_snapshot_chainstate) { | if (m_ibd_chainstate && !m_snapshot_chainstate) { | ||||
LogPrintf("[snapshot] allocating all cache to the IBD chainstate\n"); | LogPrintf("[snapshot] allocating all cache to the IBD chainstate\n"); | ||||
// Allocate everything to the IBD chainstate. | // Allocate everything to the IBD chainstate. | ||||
m_ibd_chainstate->ResizeCoinsCaches(m_total_coinstip_cache, | m_ibd_chainstate->ResizeCoinsCaches(m_total_coinstip_cache, | ||||
Show All 26 Lines |