From 1a3cbf1bd2c0d4d350063bf5162c3e1c2ec2df30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinc?= Date: Wed, 1 Jul 2026 18:34:47 -0700 Subject: [PATCH] net: optimize compact block extra tx iteration `vExtraTxnForCompact` was resized to its configured capacity on the first insertion. Before the ring was filled, compact block reconstruction scanned default `{Wtxid::ZERO, nullptr}` entries created for unused slots. Reserve the configured capacity and append entries until the cache is full, then keep the same ring-buffer overwrite behavior. This preserves the configured maximum and replacement order while keeping reconstruction from scanning unused capacity. --- src/net_processing.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 61b8a4ecd85..0b6d8fa742a 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -1907,11 +1907,13 @@ std::vector PeerManagerImpl::AbortPrivateBroadcast(const uint25 void PeerManagerImpl::AddToCompactExtraTransactions(const CTransactionRef& tx) { - if (m_opts.max_extra_txs <= 0) - return; - if (!vExtraTxnForCompact.size()) - vExtraTxnForCompact.resize(m_opts.max_extra_txs); - vExtraTxnForCompact[vExtraTxnForCompactIt] = std::make_pair(tx->GetWitnessHash(), tx); + if (m_opts.max_extra_txs == 0) return; + if (vExtraTxnForCompact.size() < m_opts.max_extra_txs) { + if (vExtraTxnForCompact.empty()) vExtraTxnForCompact.reserve(m_opts.max_extra_txs); + vExtraTxnForCompact.emplace_back(tx->GetWitnessHash(), tx); + } else { + vExtraTxnForCompact[vExtraTxnForCompactIt] = std::make_pair(tx->GetWitnessHash(), tx); + } vExtraTxnForCompactIt = (vExtraTxnForCompactIt + 1) % m_opts.max_extra_txs; }