aboutsummaryrefslogtreecommitdiff
path: root/src/init.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/init.cpp')
-rw-r--r--src/init.cpp31
1 files changed, 6 insertions, 25 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 8a83ded47a..c506a87ade 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -15,6 +15,7 @@
#include <blockfilter.h>
#include <chain.h>
#include <chainparams.h>
+#include <coins.h>
#include <compat/sanity.h>
#include <consensus/validation.h>
#include <fs.h>
@@ -146,31 +147,6 @@ NODISCARD static bool CreatePidFile()
// shutdown thing.
//
-/**
- * This is a minimally invasive approach to shutdown on LevelDB read errors from the
- * chainstate, while keeping user interface out of the common library, which is shared
- * between bitcoind, and bitcoin-qt and non-server tools.
-*/
-class CCoinsViewErrorCatcher final : public CCoinsViewBacked
-{
-public:
- explicit CCoinsViewErrorCatcher(CCoinsView* view) : CCoinsViewBacked(view) {}
- bool GetCoin(const COutPoint &outpoint, Coin &coin) const override {
- try {
- return CCoinsViewBacked::GetCoin(outpoint, coin);
- } catch(const std::runtime_error& e) {
- uiInterface.ThreadSafeMessageBox(_("Error reading from database, shutting down."), "", CClientUIInterface::MSG_ERROR);
- LogPrintf("Error reading from database: %s\n", e.what());
- // Starting the shutdown sequence and returning false to the caller would be
- // interpreted as 'entry not found' (as opposed to unable to read data), and
- // could lead to invalid interpretation. Just exit immediately, as we can't
- // continue anyway, and all writes should be atomic.
- abort();
- }
- }
- // Writes do not need similar protection, as failure to write is handled by the caller.
-};
-
static std::unique_ptr<CCoinsViewErrorCatcher> pcoinscatcher;
static std::unique_ptr<ECCVerifyHandle> globalVerifyHandle;
@@ -1542,6 +1518,11 @@ bool AppInitMain(InitInterfaces& interfaces)
pcoinsdbview.reset(new CCoinsViewDB(nCoinDBCache, false, fReset || fReindexChainState));
pcoinscatcher.reset(new CCoinsViewErrorCatcher(pcoinsdbview.get()));
+ pcoinscatcher->AddReadErrCallback([]() {
+ uiInterface.ThreadSafeMessageBox(
+ _("Error reading from database, shutting down."),
+ "", CClientUIInterface::MSG_ERROR);
+ });
// If necessary, upgrade from older database format.
// This is a no-op if we cleared the coinsviewdb with -reindex or -reindex-chainstate