aboutsummaryrefslogtreecommitdiff
path: root/src/init.cpp
diff options
context:
space:
mode:
authorCarl Dong <contact@carldong.me>2021-08-17 18:07:14 -0400
committerCarl Dong <contact@carldong.me>2021-12-06 15:56:50 -0500
commitae9121f958a4124ea6238cad0c3f2acb8b9eb4bb (patch)
treeaa63441abf035cb5c00ce9e48955f8d445b85803 /src/init.cpp
parentcbac28b72f5b831f6f84b7628f73e85627af3d94 (diff)
downloadbitcoin-ae9121f958a4124ea6238cad0c3f2acb8b9eb4bb.tar.xz
node/chainstate: Decouple from stringy errors
This allows us to separate the initialization code from translations and error reporting. This change changes the caller semantics of LoadChainstate quite drastically. To see that this change doesn't change behaviour, observe that: 1. Prior to this change, LoadChainstate returned false only in the "bad genesis block" failure case (by returning InitError()), indicating that the caller should immediately bail. After this change, the corresponding ERROR_BAD_GENESIS_BLOCK handler in src/init.cpp maintains behavioue by also bailing immediately. 2. The failed_* temporary booleans were only used to break out of the outer do/while(false) loop. They can therefore be safely removed.
Diffstat (limited to 'src/init.cpp')
-rw-r--r--src/init.cpp49
1 files changed, 43 insertions, 6 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 3dc73a058c..474a31c758 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -1418,11 +1418,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
bilingual_str strLoadError;
uiInterface.InitMessage(_("Loading block index…").translated);
-
const int64_t load_block_index_start_time = GetTimeMillis();
- bool rv = LoadChainstate(fLoaded,
- strLoadError,
- fReset,
+ auto rv = LoadChainstate(fReset,
chainman,
node,
fPruneMode,
@@ -1432,8 +1429,48 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
nBlockTreeDBCache,
nCoinDBCache,
nCoinCacheUsage);
- if (!rv) return false;
- if (fLoaded) {
+ if (rv.has_value()) {
+ switch (rv.value()) {
+ case ChainstateLoadingError::ERROR_LOADING_BLOCK_DB:
+ strLoadError = _("Error loading block database");
+ break;
+ case ChainstateLoadingError::ERROR_BAD_GENESIS_BLOCK:
+ return InitError(_("Incorrect or no genesis block found. Wrong datadir for network?"));
+ case ChainstateLoadingError::ERROR_PRUNED_NEEDS_REINDEX:
+ strLoadError = _("You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain");
+ break;
+ case ChainstateLoadingError::ERROR_LOAD_GENESIS_BLOCK_FAILED:
+ strLoadError = _("Error initializing block database");
+ break;
+ case ChainstateLoadingError::ERROR_CHAINSTATE_UPGRADE_FAILED:
+ strLoadError = _("Error upgrading chainstate database");
+ break;
+ case ChainstateLoadingError::ERROR_REPLAYBLOCKS_FAILED:
+ strLoadError = _("Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.");
+ break;
+ case ChainstateLoadingError::ERROR_LOADCHAINTIP_FAILED:
+ strLoadError = _("Error initializing block database");
+ break;
+ case ChainstateLoadingError::ERROR_GENERIC_BLOCKDB_OPEN_FAILED:
+ strLoadError = _("Error opening block database");
+ break;
+ case ChainstateLoadingError::ERROR_BLOCKS_WITNESS_INSUFFICIENTLY_VALIDATED:
+ strLoadError = strprintf(_("Witness data for blocks after height %d requires validation. Please restart with -reindex."),
+ chainparams.GetConsensus().SegwitHeight);
+ break;
+ case ChainstateLoadingError::ERROR_BLOCK_FROM_FUTURE:
+ strLoadError = _("The block database contains a block which appears to be from the future. "
+ "This may be due to your computer's date and time being set incorrectly. "
+ "Only rebuild the block database if you are sure that your computer's date and time are correct");
+ break;
+ case ChainstateLoadingError::ERROR_CORRUPTED_BLOCK_DB:
+ strLoadError = _("Corrupted block database detected");
+ break;
+ case ChainstateLoadingError::SHUTDOWN_PROBED:
+ break;
+ }
+ } else {
+ fLoaded = true;
LogPrintf(" block index %15dms\n", GetTimeMillis() - load_block_index_start_time);
}