diff --git a/src/txmempool.cpp b/src/txmempool.cpp index e6e2042e494..c931b361d47 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -413,6 +413,7 @@ static CTxMemPool::Options&& Flatten(CTxMemPool::Options&& opts, bilingual_str& CTxMemPool::CTxMemPool(Options opts, bilingual_str& error) : m_opts{Flatten(std::move(opts), error)} { + m_txgraph = MakeTxGraph(64, 101'000, ACCEPTABLE_ITERS); } bool CTxMemPool::isSpent(const COutPoint& outpoint) const @@ -1042,7 +1043,7 @@ void CCoinsViewMemPool::Reset() size_t CTxMemPool::DynamicMemoryUsage() const { LOCK(cs); // Estimate the overhead of mapTx to be 15 pointers + an allocation, as no exact formula for boost::multi_index_contained is implemented. - return memusage::MallocUsage(sizeof(CTxMemPoolEntry) + 15 * sizeof(void*)) * mapTx.size() + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + memusage::DynamicUsage(txns_randomized) + cachedInnerUsage; + return memusage::MallocUsage(sizeof(CTxMemPoolEntry) + 15 * sizeof(void*)) * mapTx.size() + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + memusage::DynamicUsage(txns_randomized) + m_txgraph->GetMainMemoryUsage() + cachedInnerUsage; } void CTxMemPool::RemoveUnbroadcastTx(const Txid& txid, const bool unchecked) { diff --git a/src/txmempool.h b/src/txmempool.h index 90da90da7db..bc6eb36c841 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,11 @@ struct bilingual_str; /** Fake height value used in Coin to signify they are only in the memory pool (since 0.8) */ static const uint32_t MEMPOOL_HEIGHT = 0x7FFFFFFF; +/** How many linearization iterations required for TxGraph clusters to have + * "acceptable" quality, if they cannot be optimally linearized with fewer + * iterations. */ +static constexpr uint64_t ACCEPTABLE_ITERS = 1'700; + /** * Test whether the LockPoints height and time are still valid on the current chain */ @@ -376,6 +382,7 @@ public: uint64_t CalculateDescendantMaximum(txiter entry) const EXCLUSIVE_LOCKS_REQUIRED(cs); private: + std::unique_ptr m_txgraph GUARDED_BY(cs); typedef std::map cacheMap;