Support -checkmempool=N, which runs checks on average once every N transactions
This commit is contained in:
parent
c6de5cc886
commit
ab1f56072a
3 changed files with 12 additions and 6 deletions
|
@ -836,7 +836,10 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
InitWarning(_("Warning: Unsupported argument -benchmark ignored, use -debug=bench."));
|
InitWarning(_("Warning: Unsupported argument -benchmark ignored, use -debug=bench."));
|
||||||
|
|
||||||
// Checkmempool and checkblockindex default to true in regtest mode
|
// Checkmempool and checkblockindex default to true in regtest mode
|
||||||
mempool.setSanityCheck(GetBoolArg("-checkmempool", chainparams.DefaultConsistencyChecks()));
|
int ratio = std::min<int>(std::max<int>(GetArg("-checkmempool", chainparams.DefaultConsistencyChecks() ? 1 : 0), 0), 1000000);
|
||||||
|
if (ratio != 0) {
|
||||||
|
mempool.setSanityCheck(1.0 / ratio);
|
||||||
|
}
|
||||||
fCheckBlockIndex = GetBoolArg("-checkblockindex", chainparams.DefaultConsistencyChecks());
|
fCheckBlockIndex = GetBoolArg("-checkblockindex", chainparams.DefaultConsistencyChecks());
|
||||||
fCheckpointsEnabled = GetBoolArg("-checkpoints", true);
|
fCheckpointsEnabled = GetBoolArg("-checkpoints", true);
|
||||||
|
|
||||||
|
|
|
@ -311,7 +311,7 @@ CTxMemPool::CTxMemPool(const CFeeRate& _minRelayFee) :
|
||||||
// Sanity checks off by default for performance, because otherwise
|
// Sanity checks off by default for performance, because otherwise
|
||||||
// accepting transactions becomes O(N^2) where N is the number
|
// accepting transactions becomes O(N^2) where N is the number
|
||||||
// of transactions in the pool
|
// of transactions in the pool
|
||||||
fSanityCheck = false;
|
nCheckFrequency = 0;
|
||||||
|
|
||||||
minerPolicyEstimator = new CBlockPolicyEstimator(_minRelayFee);
|
minerPolicyEstimator = new CBlockPolicyEstimator(_minRelayFee);
|
||||||
}
|
}
|
||||||
|
@ -483,7 +483,7 @@ void CTxMemPool::removeCoinbaseSpends(const CCoinsViewCache *pcoins, unsigned in
|
||||||
if (it2 != mapTx.end())
|
if (it2 != mapTx.end())
|
||||||
continue;
|
continue;
|
||||||
const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash);
|
const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash);
|
||||||
if (fSanityCheck) assert(coins);
|
if (nCheckFrequency != 0) assert(coins);
|
||||||
if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) {
|
if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) {
|
||||||
transactionsToRemove.push_back(tx);
|
transactionsToRemove.push_back(tx);
|
||||||
break;
|
break;
|
||||||
|
@ -553,7 +553,10 @@ void CTxMemPool::clear()
|
||||||
|
|
||||||
void CTxMemPool::check(const CCoinsViewCache *pcoins) const
|
void CTxMemPool::check(const CCoinsViewCache *pcoins) const
|
||||||
{
|
{
|
||||||
if (!fSanityCheck)
|
if (nCheckFrequency == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (insecure_rand() >= nCheckFrequency)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LogPrint("mempool", "Checking mempool with %u transactions and %u inputs\n", (unsigned int)mapTx.size(), (unsigned int)mapNextTx.size());
|
LogPrint("mempool", "Checking mempool with %u transactions and %u inputs\n", (unsigned int)mapTx.size(), (unsigned int)mapNextTx.size());
|
||||||
|
|
|
@ -277,7 +277,7 @@ public:
|
||||||
class CTxMemPool
|
class CTxMemPool
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
bool fSanityCheck; //! Normally false, true if -checkmempool or -regtest
|
uint32_t nCheckFrequency; //! Value n means that n times in 2^32 we check.
|
||||||
unsigned int nTransactionsUpdated;
|
unsigned int nTransactionsUpdated;
|
||||||
CBlockPolicyEstimator* minerPolicyEstimator;
|
CBlockPolicyEstimator* minerPolicyEstimator;
|
||||||
|
|
||||||
|
@ -338,7 +338,7 @@ public:
|
||||||
* check does nothing.
|
* check does nothing.
|
||||||
*/
|
*/
|
||||||
void check(const CCoinsViewCache *pcoins) const;
|
void check(const CCoinsViewCache *pcoins) const;
|
||||||
void setSanityCheck(bool _fSanityCheck) { fSanityCheck = _fSanityCheck; }
|
void setSanityCheck(double dFrequency = 1.0) { nCheckFrequency = dFrequency * 4294967296.0; }
|
||||||
|
|
||||||
// addUnchecked must updated state for all ancestors of a given transaction,
|
// addUnchecked must updated state for all ancestors of a given transaction,
|
||||||
// to track size/count of descendant transactions. First version of
|
// to track size/count of descendant transactions. First version of
|
||||||
|
|
Loading…
Reference in a new issue