From 5d718f6913219d3ebe8394a17ddee81915e6f0ac Mon Sep 17 00:00:00 2001 From: Murch Date: Thu, 1 Jun 2023 18:00:48 -0400 Subject: Mitigate timeout in CalculateTotalBumpFees The slow fuzz seed described in #27799 was just slower than expected, not an endless loop. Ensuring that every anscestor is only processed once speeds up the termination of the graph traversal. Fixes #27799 --- src/node/mini_miner.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/node/mini_miner.cpp b/src/node/mini_miner.cpp index 71ae9d23c7..6f253eddfa 100644 --- a/src/node/mini_miner.cpp +++ b/src/node/mini_miner.cpp @@ -346,15 +346,20 @@ std::optional MiniMiner::CalculateTotalBumpFees(const CFeeRate& target_ to_process.insert(iter); ancestors.insert(iter); } + + std::set has_been_processed; while (!to_process.empty()) { auto iter = to_process.begin(); const CTransaction& tx = (*iter)->second.GetTx(); for (const auto& input : tx.vin) { if (auto parent_it{m_entries_by_txid.find(input.prevout.hash)}; parent_it != m_entries_by_txid.end()) { - to_process.insert(parent_it); + if (!has_been_processed.count(input.prevout.hash)) { + to_process.insert(parent_it); + } ancestors.insert(parent_it); } } + has_been_processed.insert(tx.GetHash()); to_process.erase(iter); } const auto ancestor_package_size = std::accumulate(ancestors.cbegin(), ancestors.cend(), int64_t{0}, -- cgit v1.2.3