refactoring: FlushStateToDisk -> CChainState
Also renames global methods for clarity: - ::FlushStateToDisk() -> CChainState::ForceFlushStateToDisk() - This performs an unconditional flush. - ::PruneAndFlush() -> CChainState::PruneAndFlush()
This commit is contained in:
parent
4d6688603b
commit
3ccbc376dd
4 changed files with 52 additions and 35 deletions
|
@ -259,7 +259,7 @@ void Shutdown(InitInterfaces& interfaces)
|
||||||
|
|
||||||
// FlushStateToDisk generates a ChainStateFlushed callback, which we should avoid missing
|
// FlushStateToDisk generates a ChainStateFlushed callback, which we should avoid missing
|
||||||
if (pcoinsTip != nullptr) {
|
if (pcoinsTip != nullptr) {
|
||||||
FlushStateToDisk();
|
::ChainstateActive().ForceFlushStateToDisk();
|
||||||
}
|
}
|
||||||
|
|
||||||
// After there are no more peers/RPC left to give us new data which may generate
|
// After there are no more peers/RPC left to give us new data which may generate
|
||||||
|
@ -275,7 +275,7 @@ void Shutdown(InitInterfaces& interfaces)
|
||||||
{
|
{
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
if (pcoinsTip != nullptr) {
|
if (pcoinsTip != nullptr) {
|
||||||
FlushStateToDisk();
|
::ChainstateActive().ForceFlushStateToDisk();
|
||||||
}
|
}
|
||||||
pcoinsTip.reset();
|
pcoinsTip.reset();
|
||||||
pcoinscatcher.reset();
|
pcoinscatcher.reset();
|
||||||
|
@ -1692,7 +1692,7 @@ bool AppInitMain(InitInterfaces& interfaces)
|
||||||
nLocalServices = ServiceFlags(nLocalServices & ~NODE_NETWORK);
|
nLocalServices = ServiceFlags(nLocalServices & ~NODE_NETWORK);
|
||||||
if (!fReindex) {
|
if (!fReindex) {
|
||||||
uiInterface.InitMessage(_("Pruning blockstore..."));
|
uiInterface.InitMessage(_("Pruning blockstore..."));
|
||||||
PruneAndFlush();
|
::ChainstateActive().PruneAndFlush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1077,7 +1077,7 @@ static UniValue gettxoutsetinfo(const JSONRPCRequest& request)
|
||||||
UniValue ret(UniValue::VOBJ);
|
UniValue ret(UniValue::VOBJ);
|
||||||
|
|
||||||
CCoinsStats stats;
|
CCoinsStats stats;
|
||||||
FlushStateToDisk();
|
::ChainstateActive().ForceFlushStateToDisk();
|
||||||
if (GetUTXOStats(pcoinsdbview.get(), stats)) {
|
if (GetUTXOStats(pcoinsdbview.get(), stats)) {
|
||||||
ret.pushKV("height", (int64_t)stats.nHeight);
|
ret.pushKV("height", (int64_t)stats.nHeight);
|
||||||
ret.pushKV("bestblock", stats.hashBlock.GetHex());
|
ret.pushKV("bestblock", stats.hashBlock.GetHex());
|
||||||
|
@ -2283,7 +2283,7 @@ UniValue scantxoutset(const JSONRPCRequest& request)
|
||||||
std::unique_ptr<CCoinsViewCursor> pcursor;
|
std::unique_ptr<CCoinsViewCursor> pcursor;
|
||||||
{
|
{
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
FlushStateToDisk();
|
::ChainstateActive().ForceFlushStateToDisk();
|
||||||
pcursor = std::unique_ptr<CCoinsViewCursor>(pcoinsdbview->Cursor());
|
pcursor = std::unique_ptr<CCoinsViewCursor>(pcoinsdbview->Cursor());
|
||||||
assert(pcursor);
|
assert(pcursor);
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,15 +173,7 @@ std::unique_ptr<CCoinsViewDB> pcoinsdbview;
|
||||||
std::unique_ptr<CCoinsViewCache> pcoinsTip;
|
std::unique_ptr<CCoinsViewCache> pcoinsTip;
|
||||||
std::unique_ptr<CBlockTreeDB> pblocktree;
|
std::unique_ptr<CBlockTreeDB> pblocktree;
|
||||||
|
|
||||||
enum class FlushStateMode {
|
|
||||||
NONE,
|
|
||||||
IF_NEEDED,
|
|
||||||
PERIODIC,
|
|
||||||
ALWAYS
|
|
||||||
};
|
|
||||||
|
|
||||||
// See definition for documentation
|
// See definition for documentation
|
||||||
static bool FlushStateToDisk(const CChainParams& chainParams, CValidationState &state, FlushStateMode mode, int nManualPruneHeight=0);
|
|
||||||
static void FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeight);
|
static void FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeight);
|
||||||
static void FindFilesToPrune(std::set<int>& setFilesToPrune, uint64_t nPruneAfterHeight);
|
static void FindFilesToPrune(std::set<int>& setFilesToPrune, uint64_t nPruneAfterHeight);
|
||||||
bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheSigStore, bool cacheFullScriptStore, PrecomputedTransactionData& txdata, std::vector<CScriptCheck> *pvChecks = nullptr);
|
bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheSigStore, bool cacheFullScriptStore, PrecomputedTransactionData& txdata, std::vector<CScriptCheck> *pvChecks = nullptr);
|
||||||
|
@ -854,7 +846,7 @@ static bool AcceptToMemoryPoolWithTime(const CChainParams& chainparams, CTxMemPo
|
||||||
}
|
}
|
||||||
// After we've (potentially) uncached entries, ensure our coins cache is still within its size limits
|
// After we've (potentially) uncached entries, ensure our coins cache is still within its size limits
|
||||||
CValidationState stateDummy;
|
CValidationState stateDummy;
|
||||||
FlushStateToDisk(chainparams, stateDummy, FlushStateMode::PERIODIC);
|
::ChainstateActive().FlushStateToDisk(chainparams, stateDummy, FlushStateMode::PERIODIC);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1951,16 +1943,12 @@ bool CChainState::ConnectBlock(const CBlock& block, CValidationState& state, CBl
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
bool CChainState::FlushStateToDisk(
|
||||||
* Update the on-disk chain state.
|
const CChainParams& chainparams,
|
||||||
* The caches and indexes are flushed depending on the mode we're called with
|
CValidationState &state,
|
||||||
* if they're too large, if it's been a while since the last write,
|
FlushStateMode mode,
|
||||||
* or always and in all cases if we're in prune mode and are deleting files.
|
int nManualPruneHeight)
|
||||||
*
|
{
|
||||||
* If FlushStateMode::NONE is used, then FlushStateToDisk(...) won't do anything
|
|
||||||
* besides checking if we need to prune.
|
|
||||||
*/
|
|
||||||
bool static FlushStateToDisk(const CChainParams& chainparams, CValidationState &state, FlushStateMode mode, int nManualPruneHeight) {
|
|
||||||
int64_t nMempoolUsage = mempool.DynamicMemoryUsage();
|
int64_t nMempoolUsage = mempool.DynamicMemoryUsage();
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
static int64_t nLastWrite = 0;
|
static int64_t nLastWrite = 0;
|
||||||
|
@ -2058,7 +2046,7 @@ bool static FlushStateToDisk(const CChainParams& chainparams, CValidationState &
|
||||||
}
|
}
|
||||||
if (full_flush_completed) {
|
if (full_flush_completed) {
|
||||||
// Update best block in wallet (so we can detect restored wallets).
|
// Update best block in wallet (so we can detect restored wallets).
|
||||||
GetMainSignals().ChainStateFlushed(::ChainActive().GetLocator());
|
GetMainSignals().ChainStateFlushed(m_chain.GetLocator());
|
||||||
}
|
}
|
||||||
} catch (const std::runtime_error& e) {
|
} catch (const std::runtime_error& e) {
|
||||||
return AbortNode(state, std::string("System error while flushing: ") + e.what());
|
return AbortNode(state, std::string("System error while flushing: ") + e.what());
|
||||||
|
@ -2066,19 +2054,20 @@ bool static FlushStateToDisk(const CChainParams& chainparams, CValidationState &
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FlushStateToDisk() {
|
void CChainState::ForceFlushStateToDisk() {
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
const CChainParams& chainparams = Params();
|
const CChainParams& chainparams = Params();
|
||||||
if (!FlushStateToDisk(chainparams, state, FlushStateMode::ALWAYS)) {
|
if (!this->FlushStateToDisk(chainparams, state, FlushStateMode::ALWAYS)) {
|
||||||
LogPrintf("%s: failed to flush state (%s)\n", __func__, FormatStateMessage(state));
|
LogPrintf("%s: failed to flush state (%s)\n", __func__, FormatStateMessage(state));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PruneAndFlush() {
|
void CChainState::PruneAndFlush() {
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
fCheckForPruning = true;
|
fCheckForPruning = true;
|
||||||
const CChainParams& chainparams = Params();
|
const CChainParams& chainparams = Params();
|
||||||
if (!FlushStateToDisk(chainparams, state, FlushStateMode::NONE)) {
|
|
||||||
|
if (!this->FlushStateToDisk(chainparams, state, FlushStateMode::NONE)) {
|
||||||
LogPrintf("%s: failed to flush state (%s)\n", __func__, FormatStateMessage(state));
|
LogPrintf("%s: failed to flush state (%s)\n", __func__, FormatStateMessage(state));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3587,7 +3576,8 @@ void PruneBlockFilesManual(int nManualPruneHeight)
|
||||||
{
|
{
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
const CChainParams& chainparams = Params();
|
const CChainParams& chainparams = Params();
|
||||||
if (!FlushStateToDisk(chainparams, state, FlushStateMode::NONE, nManualPruneHeight)) {
|
if (!::ChainstateActive().FlushStateToDisk(
|
||||||
|
chainparams, state, FlushStateMode::NONE, nManualPruneHeight)) {
|
||||||
LogPrintf("%s: failed to flush state (%s)\n", __func__, FormatStateMessage(state));
|
LogPrintf("%s: failed to flush state (%s)\n", __func__, FormatStateMessage(state));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4183,7 +4173,7 @@ bool RewindBlockIndex(const CChainParams& params) {
|
||||||
// and skip it here, we're about to -reindex-chainstate anyway, so
|
// and skip it here, we're about to -reindex-chainstate anyway, so
|
||||||
// it'll get called a bunch real soon.
|
// it'll get called a bunch real soon.
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
if (!FlushStateToDisk(params, state, FlushStateMode::ALWAYS)) {
|
if (!::ChainstateActive().FlushStateToDisk(params, state, FlushStateMode::ALWAYS)) {
|
||||||
LogPrintf("RewindBlockIndex: unable to flush state to disk (%s)\n", FormatStateMessage(state));
|
LogPrintf("RewindBlockIndex: unable to flush state to disk (%s)\n", FormatStateMessage(state));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
class CChainState;
|
||||||
class CBlockIndex;
|
class CBlockIndex;
|
||||||
class CBlockTreeDB;
|
class CBlockTreeDB;
|
||||||
class CBlockUndo;
|
class CBlockUndo;
|
||||||
|
@ -277,10 +278,6 @@ void PruneOneBlockFile(const int fileNumber) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
*/
|
*/
|
||||||
void UnlinkPrunedFiles(const std::set<int>& setFilesToPrune);
|
void UnlinkPrunedFiles(const std::set<int>& setFilesToPrune);
|
||||||
|
|
||||||
/** Flush all state, indexes and buffers to disk. */
|
|
||||||
void FlushStateToDisk();
|
|
||||||
/** Prune block files and flush state to disk. */
|
|
||||||
void PruneAndFlush();
|
|
||||||
/** Prune block files up to a given height */
|
/** Prune block files up to a given height */
|
||||||
void PruneBlockFilesManual(int nManualPruneHeight);
|
void PruneBlockFilesManual(int nManualPruneHeight);
|
||||||
|
|
||||||
|
@ -432,6 +429,14 @@ enum DisconnectResult
|
||||||
|
|
||||||
class ConnectTrace;
|
class ConnectTrace;
|
||||||
|
|
||||||
|
/** @see CChainState::FlushStateToDisk */
|
||||||
|
enum class FlushStateMode {
|
||||||
|
NONE,
|
||||||
|
IF_NEEDED,
|
||||||
|
PERIODIC,
|
||||||
|
ALWAYS
|
||||||
|
};
|
||||||
|
|
||||||
struct CBlockIndexWorkComparator
|
struct CBlockIndexWorkComparator
|
||||||
{
|
{
|
||||||
bool operator()(const CBlockIndex *pa, const CBlockIndex *pb) const;
|
bool operator()(const CBlockIndex *pa, const CBlockIndex *pb) const;
|
||||||
|
@ -508,6 +513,28 @@ public:
|
||||||
|
|
||||||
bool LoadBlockIndex(const Consensus::Params& consensus_params, CBlockTreeDB& blocktree) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
bool LoadBlockIndex(const Consensus::Params& consensus_params, CBlockTreeDB& blocktree) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the on-disk chain state.
|
||||||
|
* The caches and indexes are flushed depending on the mode we're called with
|
||||||
|
* if they're too large, if it's been a while since the last write,
|
||||||
|
* or always and in all cases if we're in prune mode and are deleting files.
|
||||||
|
*
|
||||||
|
* If FlushStateMode::NONE is used, then FlushStateToDisk(...) won't do anything
|
||||||
|
* besides checking if we need to prune.
|
||||||
|
*/
|
||||||
|
bool FlushStateToDisk(
|
||||||
|
const CChainParams& chainparams,
|
||||||
|
CValidationState &state,
|
||||||
|
FlushStateMode mode,
|
||||||
|
int nManualPruneHeight = 0);
|
||||||
|
|
||||||
|
//! Unconditionally flush all changes to disk.
|
||||||
|
void ForceFlushStateToDisk();
|
||||||
|
|
||||||
|
//! Prune blockfiles from the disk if necessary and then flush chainstate changes
|
||||||
|
//! if we pruned.
|
||||||
|
void PruneAndFlush();
|
||||||
|
|
||||||
bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, std::shared_ptr<const CBlock> pblock) LOCKS_EXCLUDED(cs_main);
|
bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, std::shared_ptr<const CBlock> pblock) LOCKS_EXCLUDED(cs_main);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue