Skip to content

Commit

Permalink
Perform CVerifyDB on pcoinsdbview instead of pcoinsTip
Browse files Browse the repository at this point in the history
Bypassing the main coins cache allows more thorough checking with the same
memory budget.

This has no effect on performance because everything ends up in the child
cache created by VerifyDB itself.

It has bugged me ever since bitcoin#4675, which effectively reduced the
number of checked blocks to reduce peak memory usage.

- Pass the coinsview to use as argument to VerifyDB

- This also avoids that the first `pcoinsTip->Flush()` after VerifyDB
  writes a large slew of unchanged coin records back to the database.
  • Loading branch information
laanwj committed Aug 27, 2014
1 parent f30801a commit 2e28031
Show file tree
Hide file tree
Showing 4 changed files with 5 additions and 5 deletions.
2 changes: 1 addition & 1 deletion src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -969,7 +969,7 @@ bool AppInit2(boost::thread_group& threadGroup)
}

uiInterface.InitMessage(_("Verifying blocks..."));
if (!CVerifyDB().VerifyDB(GetArg("-checklevel", 3),
if (!CVerifyDB().VerifyDB(pcoinsdbview, GetArg("-checklevel", 3),
GetArg("-checkblocks", 288))) {
strLoadError = _("Corrupted block database detected");
break;
Expand Down
4 changes: 2 additions & 2 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3018,7 +3018,7 @@ CVerifyDB::~CVerifyDB()
uiInterface.ShowProgress("", 100);
}

bool CVerifyDB::VerifyDB(int nCheckLevel, int nCheckDepth)
bool CVerifyDB::VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth)
{
LOCK(cs_main);
if (chainActive.Tip() == NULL || chainActive.Tip()->pprev == NULL)
Expand All @@ -3031,7 +3031,7 @@ bool CVerifyDB::VerifyDB(int nCheckLevel, int nCheckDepth)
nCheckDepth = chainActive.Height();
nCheckLevel = std::max(0, std::min(4, nCheckLevel));
LogPrintf("Verifying last %i blocks at level %i\n", nCheckDepth, nCheckLevel);
CCoinsViewCache coins(*pcoinsTip, true);
CCoinsViewCache coins(*coinsview, true);
CBlockIndex* pindexState = chainActive.Tip();
CBlockIndex* pindexFailure = NULL;
int nGoodTransactions = 0;
Expand Down
2 changes: 1 addition & 1 deletion src/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -942,7 +942,7 @@ class CVerifyDB {
public:
CVerifyDB();
~CVerifyDB();
bool VerifyDB(int nCheckLevel, int nCheckDepth);
bool VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth);
};

/** An in-memory indexed chain of blocks. */
Expand Down
2 changes: 1 addition & 1 deletion src/rpcblockchain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ Value verifychain(const Array& params, bool fHelp)
if (params.size() > 1)
nCheckDepth = params[1].get_int();

return CVerifyDB().VerifyDB(nCheckLevel, nCheckDepth);
return CVerifyDB().VerifyDB(pcoinsTip, nCheckLevel, nCheckDepth);
}

Value getblockchaininfo(const Array& params, bool fHelp)
Expand Down

0 comments on commit 2e28031

Please sign in to comment.