Fix missing cs_main lock for GuessVerificationProgress()

This commit is contained in:
Jonas Schnelli 2018-01-28 09:15:18 -10:00
parent 6970b30c6f
commit 90ba2df11b
No known key found for this signature in database
GPG Key ID: 1EB776BB03C7922D
3 changed files with 6 additions and 9 deletions

View File

@ -138,9 +138,9 @@ size_t ClientModel::getMempoolDynamicUsage() const
double ClientModel::getVerificationProgress(const CBlockIndex *tipIn) const double ClientModel::getVerificationProgress(const CBlockIndex *tipIn) const
{ {
CBlockIndex *tip = const_cast<CBlockIndex *>(tipIn); CBlockIndex *tip = const_cast<CBlockIndex *>(tipIn);
LOCK(cs_main);
if (!tip) if (!tip)
{ {
LOCK(cs_main);
tip = chainActive.Tip(); tip = chainActive.Tip();
} }
return GuessVerificationProgress(Params().TxData(), tip); return GuessVerificationProgress(Params().TxData(), tip);

View File

@ -4659,6 +4659,7 @@ bool DumpMempool(void)
} }
//! Guess how far we are in the verification process at the given block index //! Guess how far we are in the verification process at the given block index
//! require cs_main if pindex has not been validated yet (because nChainTx might be unset)
double GuessVerificationProgress(const ChainTxData& data, const CBlockIndex *pindex) { double GuessVerificationProgress(const ChainTxData& data, const CBlockIndex *pindex) {
if (pindex == nullptr) if (pindex == nullptr)
return 0.0; return 0.0;

View File

@ -1673,20 +1673,15 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlock
dProgressStart = GuessVerificationProgress(chainParams.TxData(), pindex); dProgressStart = GuessVerificationProgress(chainParams.TxData(), pindex);
dProgressTip = GuessVerificationProgress(chainParams.TxData(), tip); dProgressTip = GuessVerificationProgress(chainParams.TxData(), tip);
} }
double gvp = dProgressStart;
while (pindex && !fAbortRescan) while (pindex && !fAbortRescan)
{ {
if (pindex->nHeight % 100 == 0 && dProgressTip - dProgressStart > 0.0) { if (pindex->nHeight % 100 == 0 && dProgressTip - dProgressStart > 0.0) {
double gvp = 0;
{
LOCK(cs_main);
gvp = GuessVerificationProgress(chainParams.TxData(), pindex);
}
ShowProgress(_("Rescanning..."), std::max(1, std::min(99, (int)((gvp - dProgressStart) / (dProgressTip - dProgressStart) * 100)))); ShowProgress(_("Rescanning..."), std::max(1, std::min(99, (int)((gvp - dProgressStart) / (dProgressTip - dProgressStart) * 100))));
} }
if (GetTime() >= nNow + 60) { if (GetTime() >= nNow + 60) {
nNow = GetTime(); nNow = GetTime();
LOCK(cs_main); LogPrintf("Still rescanning. At block %d. Progress=%f\n", pindex->nHeight, gvp);
LogPrintf("Still rescanning. At block %d. Progress=%f\n", pindex->nHeight, GuessVerificationProgress(chainParams.TxData(), pindex));
} }
CBlock block; CBlock block;
@ -1710,6 +1705,7 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlock
{ {
LOCK(cs_main); LOCK(cs_main);
pindex = chainActive.Next(pindex); pindex = chainActive.Next(pindex);
gvp = GuessVerificationProgress(chainParams.TxData(), pindex);
if (tip != chainActive.Tip()) { if (tip != chainActive.Tip()) {
tip = chainActive.Tip(); tip = chainActive.Tip();
// in case the tip has changed, update progress max // in case the tip has changed, update progress max
@ -1718,7 +1714,7 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlock
} }
} }
if (pindex && fAbortRescan) { if (pindex && fAbortRescan) {
LogPrintf("Rescan aborted at block %d. Progress=%f\n", pindex->nHeight, GuessVerificationProgress(chainParams.TxData(), pindex)); LogPrintf("Rescan aborted at block %d. Progress=%f\n", pindex->nHeight, gvp);
} }
ShowProgress(_("Rescanning..."), 100); // hide progress dialog in GUI ShowProgress(_("Rescanning..."), 100); // hide progress dialog in GUI
} }