aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElle Mouton <elle.mouton@gmail.com>2020-10-20 20:09:55 +0200
committerElle Mouton <elle.mouton@gmail.com>2020-10-23 14:14:57 +0200
commit9d4b4b2c2c49774523de740d6492ee5b1ee15e74 (patch)
tree017771d3a7b54af87ceccc1003234f3b940f889d
parent88271184e82222f556d67511cc64230b0532f40d (diff)
downloadbitcoin-9d4b4b2c2c49774523de740d6492ee5b1ee15e74.tar.xz
refactor: Avoid double to int cast for nCheckFrequency
Use a ratio instead of a frequency that requires a double to int cast for determining how often a mempool sanity check should run.
-rw-r--r--src/init.cpp6
-rw-r--r--src/txmempool.cpp10
-rw-r--r--src/txmempool.h4
3 files changed, 8 insertions, 12 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 1387d6b982..51a4943478 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -1394,10 +1394,8 @@ bool AppInitMain(const util::Ref& context, NodeContext& node, interfaces::BlockA
assert(!node.mempool);
node.mempool = MakeUnique<CTxMemPool>(&::feeEstimator);
if (node.mempool) {
- int ratio = std::min<int>(std::max<int>(args.GetArg("-checkmempool", chainparams.DefaultConsistencyChecks() ? 1 : 0), 0), 1000000);
- if (ratio != 0) {
- node.mempool->setSanityCheck(1.0 / ratio);
- }
+ int check_ratio = std::min<int>(std::max<int>(args.GetArg("-checkmempool", chainparams.DefaultConsistencyChecks() ? 1 : 0), 0), 1000000);
+ node.mempool->setSanityCheck(check_ratio);
}
assert(!node.chainman);
diff --git a/src/txmempool.cpp b/src/txmempool.cpp
index 0c2b731967..78af3bf833 100644
--- a/src/txmempool.cpp
+++ b/src/txmempool.cpp
@@ -339,7 +339,7 @@ CTxMemPool::CTxMemPool(CBlockPolicyEstimator* estimator)
// Sanity checks off by default for performance, because otherwise
// accepting transactions becomes O(N^2) where N is the number
// of transactions in the pool
- nCheckFrequency = 0;
+ m_check_ratio = 0;
}
bool CTxMemPool::isSpent(const COutPoint& outpoint) const
@@ -523,7 +523,7 @@ void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMem
if (it2 != mapTx.end())
continue;
const Coin &coin = pcoins->AccessCoin(txin.prevout);
- if (nCheckFrequency != 0) assert(!coin.IsSpent());
+ if (m_check_ratio != 0) assert(!coin.IsSpent());
if (coin.IsSpent() || (coin.IsCoinBase() && ((signed long)nMemPoolHeight) - coin.nHeight < COINBASE_MATURITY)) {
txToRemove.insert(it);
break;
@@ -620,11 +620,9 @@ static void CheckInputsAndUpdateCoins(const CTransaction& tx, CCoinsViewCache& m
void CTxMemPool::check(const CCoinsViewCache *pcoins) const
{
LOCK(cs);
- if (nCheckFrequency == 0)
- return;
+ if (m_check_ratio == 0) return;
- if (GetRand(std::numeric_limits<uint32_t>::max()) >= nCheckFrequency)
- return;
+ if (GetRand(m_check_ratio) >= 1) return;
LogPrint(BCLog::MEMPOOL, "Checking mempool with %u transactions and %u inputs\n", (unsigned int)mapTx.size(), (unsigned int)mapNextTx.size());
diff --git a/src/txmempool.h b/src/txmempool.h
index f513f14af6..38abc65c5d 100644
--- a/src/txmempool.h
+++ b/src/txmempool.h
@@ -488,7 +488,7 @@ public:
class CTxMemPool
{
private:
- uint32_t nCheckFrequency GUARDED_BY(cs); //!< Value n means that n times in 2^32 we check.
+ uint32_t m_check_ratio GUARDED_BY(cs); //!< Value n means that 1 times in n we check.
std::atomic<unsigned int> nTransactionsUpdated; //!< Used by getblocktemplate to trigger CreateNewBlock() invocation
CBlockPolicyEstimator* minerPolicyEstimator;
@@ -611,7 +611,7 @@ public:
* check does nothing.
*/
void check(const CCoinsViewCache *pcoins) const;
- void setSanityCheck(double dFrequency = 1.0) { LOCK(cs); nCheckFrequency = static_cast<uint32_t>(dFrequency * 4294967295.0); }
+ void setSanityCheck(int check_ratio = 0) { LOCK(cs); m_check_ratio = check_ratio; }
// addUnchecked must updated state for all ancestors of a given transaction,
// to track size/count of descendant transactions. First version of