mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-08-30 04:11:11 +02:00
node/chainstate: Decouple from concept of uiInterface
...instead allow the caller to optionally pass in callbacks which are triggered for certain events. Behaviour change: The string "Verifying blocks..." was previously printed for each chainstate in chainman which did not have an effectively empty coinsview, now it will be printed once unconditionally before we call VerifyLoadedChain.
This commit is contained in:
@@ -1427,7 +1427,12 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
|||||||
fReindexChainState,
|
fReindexChainState,
|
||||||
nBlockTreeDBCache,
|
nBlockTreeDBCache,
|
||||||
nCoinDBCache,
|
nCoinDBCache,
|
||||||
nCoinCacheUsage);
|
nCoinCacheUsage,
|
||||||
|
[]() {
|
||||||
|
uiInterface.ThreadSafeMessageBox(
|
||||||
|
_("Error reading from database, shutting down."),
|
||||||
|
"", CClientUIInterface::MSG_ERROR);
|
||||||
|
});
|
||||||
if (rv.has_value()) {
|
if (rv.has_value()) {
|
||||||
switch (rv.value()) {
|
switch (rv.value()) {
|
||||||
case ChainstateLoadingError::ERROR_LOADING_BLOCK_DB:
|
case ChainstateLoadingError::ERROR_LOADING_BLOCK_DB:
|
||||||
@@ -1463,6 +1468,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
uiInterface.InitMessage(_("Verifying blocks…").translated);
|
||||||
auto rv2 = VerifyLoadedChainstate(chainman,
|
auto rv2 = VerifyLoadedChainstate(chainman,
|
||||||
fReset,
|
fReset,
|
||||||
fReindexChainState,
|
fReindexChainState,
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
#include <rpc/blockchain.h> // for RPCNotifyBlockChange
|
#include <rpc/blockchain.h> // for RPCNotifyBlockChange
|
||||||
#include <util/time.h> // for GetTime
|
#include <util/time.h> // for GetTime
|
||||||
#include <node/blockstorage.h> // for CleanupBlockRevFiles, fHavePruned, fReindex
|
#include <node/blockstorage.h> // for CleanupBlockRevFiles, fHavePruned, fReindex
|
||||||
#include <node/ui_interface.h> // for InitError, uiInterface, and CClientUIInterface member access
|
|
||||||
#include <shutdown.h> // for ShutdownRequested
|
#include <shutdown.h> // for ShutdownRequested
|
||||||
#include <validation.h> // for a lot of things
|
#include <validation.h> // for a lot of things
|
||||||
|
|
||||||
@@ -20,7 +19,8 @@ std::optional<ChainstateLoadingError> LoadChainstate(bool fReset,
|
|||||||
bool fReindexChainState,
|
bool fReindexChainState,
|
||||||
int64_t nBlockTreeDBCache,
|
int64_t nBlockTreeDBCache,
|
||||||
int64_t nCoinDBCache,
|
int64_t nCoinDBCache,
|
||||||
int64_t nCoinCacheUsage)
|
int64_t nCoinCacheUsage,
|
||||||
|
std::function<void()> coins_error_cb)
|
||||||
{
|
{
|
||||||
auto is_coinsview_empty = [&](CChainState* chainstate) EXCLUSIVE_LOCKS_REQUIRED(::cs_main) {
|
auto is_coinsview_empty = [&](CChainState* chainstate) EXCLUSIVE_LOCKS_REQUIRED(::cs_main) {
|
||||||
return fReset || fReindexChainState || chainstate->CoinsTip().GetBestBlock().IsNull();
|
return fReset || fReindexChainState || chainstate->CoinsTip().GetBestBlock().IsNull();
|
||||||
@@ -86,11 +86,9 @@ std::optional<ChainstateLoadingError> LoadChainstate(bool fReset,
|
|||||||
/* in_memory */ false,
|
/* in_memory */ false,
|
||||||
/* should_wipe */ fReset || fReindexChainState);
|
/* should_wipe */ fReset || fReindexChainState);
|
||||||
|
|
||||||
chainstate->CoinsErrorCatcher().AddReadErrCallback([]() {
|
if (coins_error_cb) {
|
||||||
uiInterface.ThreadSafeMessageBox(
|
chainstate->CoinsErrorCatcher().AddReadErrCallback(coins_error_cb);
|
||||||
_("Error reading from database, shutting down."),
|
}
|
||||||
"", CClientUIInterface::MSG_ERROR);
|
|
||||||
});
|
|
||||||
|
|
||||||
// If necessary, upgrade from older database format.
|
// If necessary, upgrade from older database format.
|
||||||
// This is a no-op if we cleared the coinsviewdb with -reindex or -reindex-chainstate
|
// This is a no-op if we cleared the coinsviewdb with -reindex or -reindex-chainstate
|
||||||
@@ -148,7 +146,6 @@ std::optional<ChainstateLoadVerifyError> VerifyLoadedChainstate(ChainstateManage
|
|||||||
|
|
||||||
for (CChainState* chainstate : chainman.GetAll()) {
|
for (CChainState* chainstate : chainman.GetAll()) {
|
||||||
if (!is_coinsview_empty(chainstate)) {
|
if (!is_coinsview_empty(chainstate)) {
|
||||||
uiInterface.InitMessage(_("Verifying blocks…").translated);
|
|
||||||
if (fHavePruned && check_blocks > MIN_BLOCKS_TO_KEEP) {
|
if (fHavePruned && check_blocks > MIN_BLOCKS_TO_KEEP) {
|
||||||
LogPrintf("Prune: pruned datadir may not have more than %d blocks; only checking available blocks\n",
|
LogPrintf("Prune: pruned datadir may not have more than %d blocks; only checking available blocks\n",
|
||||||
MIN_BLOCKS_TO_KEEP);
|
MIN_BLOCKS_TO_KEEP);
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
#define BITCOIN_NODE_CHAINSTATE_H
|
#define BITCOIN_NODE_CHAINSTATE_H
|
||||||
|
|
||||||
#include <cstdint> // for int64_t
|
#include <cstdint> // for int64_t
|
||||||
|
#include <functional> // for std::function
|
||||||
#include <optional> // for std::optional
|
#include <optional> // for std::optional
|
||||||
|
|
||||||
class CChainParams;
|
class CChainParams;
|
||||||
@@ -59,7 +60,8 @@ std::optional<ChainstateLoadingError> LoadChainstate(bool fReset,
|
|||||||
bool fReindexChainState,
|
bool fReindexChainState,
|
||||||
int64_t nBlockTreeDBCache,
|
int64_t nBlockTreeDBCache,
|
||||||
int64_t nCoinDBCache,
|
int64_t nCoinDBCache,
|
||||||
int64_t nCoinCacheUsage);
|
int64_t nCoinCacheUsage,
|
||||||
|
std::function<void()> coins_error_cb = nullptr);
|
||||||
|
|
||||||
enum class ChainstateLoadVerifyError {
|
enum class ChainstateLoadVerifyError {
|
||||||
ERROR_BLOCK_FROM_FUTURE,
|
ERROR_BLOCK_FROM_FUTURE,
|
||||||
|
Reference in New Issue
Block a user