ported from 13cdce4336
This commit is contained in:
parent
90ad641d39
commit
aa544887d7
26
src/init.cpp
26
src/init.cpp
@ -106,7 +106,28 @@ bool ShutdownRequested()
|
|||||||
return fRequestShutdown;
|
return fRequestShutdown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CCoinsViewErrorCatcher : public CCoinsViewBacked
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CCoinsViewErrorCatcher(CCoinsView& view) : CCoinsViewBacked(view) {}
|
||||||
|
bool GetCoins(const uint256 &txid, CCoins &coins) {
|
||||||
|
try {
|
||||||
|
return CCoinsViewBacked::GetCoins(txid, coins);
|
||||||
|
} 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 interpration. 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 CCoinsViewDB *pcoinsdbview;
|
static CCoinsViewDB *pcoinsdbview;
|
||||||
|
static CCoinsViewErrorCatcher *pcoinscatcher = NULL;
|
||||||
|
|
||||||
void Shutdown()
|
void Shutdown()
|
||||||
{
|
{
|
||||||
@ -137,6 +158,7 @@ void Shutdown()
|
|||||||
if (pcoinsTip)
|
if (pcoinsTip)
|
||||||
pcoinsTip->Flush();
|
pcoinsTip->Flush();
|
||||||
delete pcoinsTip; pcoinsTip = NULL;
|
delete pcoinsTip; pcoinsTip = NULL;
|
||||||
|
delete pcoinscatcher; pcoinscatcher = NULL;
|
||||||
delete pcoinsdbview; pcoinsdbview = NULL;
|
delete pcoinsdbview; pcoinsdbview = NULL;
|
||||||
delete pblocktree; pblocktree = NULL;
|
delete pblocktree; pblocktree = NULL;
|
||||||
}
|
}
|
||||||
@ -888,11 +910,13 @@ bool AppInit2(boost::thread_group& threadGroup)
|
|||||||
UnloadBlockIndex();
|
UnloadBlockIndex();
|
||||||
delete pcoinsTip;
|
delete pcoinsTip;
|
||||||
delete pcoinsdbview;
|
delete pcoinsdbview;
|
||||||
|
delete pcoinscatcher;
|
||||||
delete pblocktree;
|
delete pblocktree;
|
||||||
|
|
||||||
pblocktree = new CBlockTreeDB(nBlockTreeDBCache, false, fReindex);
|
pblocktree = new CBlockTreeDB(nBlockTreeDBCache, false, fReindex);
|
||||||
pcoinsdbview = new CCoinsViewDB(nCoinDBCache, false, fReindex);
|
pcoinsdbview = new CCoinsViewDB(nCoinDBCache, false, fReindex);
|
||||||
pcoinsTip = new CCoinsViewCache(*pcoinsdbview);
|
pcoinscatcher = new CCoinsViewErrorCatcher(*pcoinsdbview);
|
||||||
|
pcoinsTip = new CCoinsViewCache(*pcoinscatcher);
|
||||||
|
|
||||||
if (fReindex)
|
if (fReindex)
|
||||||
pblocktree->WriteReindexing(true);
|
pblocktree->WriteReindexing(true);
|
||||||
|
Loading…
Reference in New Issue
Block a user