From 999d18ab1ca6f802f13bfae8c4d10572ae55c6c3 Mon Sep 17 00:00:00 2001 From: Mccalabrese Date: Mon, 23 Mar 2026 08:22:20 -0400 Subject: [PATCH] net: introduce TxSendStatus internal state container --- src/private_broadcast.cpp | 22 +++++++++++----------- src/private_broadcast.h | 7 +++++-- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/private_broadcast.cpp b/src/private_broadcast.cpp index 3900f10a932..ce42dfd8f99 100644 --- a/src/private_broadcast.cpp +++ b/src/private_broadcast.cpp @@ -25,7 +25,7 @@ std::optional PrivateBroadcast::Remove(const CTransactionRef& tx) LOCK(m_mutex); const auto handle{m_transactions.extract(tx)}; if (handle) { - const auto p{DerivePriority(handle.mapped())}; + const auto p{DerivePriority(handle.mapped().send_statuses)}; return p.num_confirmed; } return std::nullopt; @@ -39,11 +39,11 @@ std::optional PrivateBroadcast::PickTxForSend(const NodeId& wil const auto it{std::ranges::max_element( m_transactions, [](const auto& a, const auto& b) { return a < b; }, - [](const auto& el) { return DerivePriority(el.second); })}; + [](const auto& el) { return DerivePriority(el.second.send_statuses); })}; if (it != m_transactions.end()) { - auto& [tx, sent_to]{*it}; - sent_to.emplace_back(will_send_to_nodeid, will_send_to_address, NodeClock::now()); + auto& [tx, state]{*it}; + state.send_statuses.emplace_back(will_send_to_nodeid, will_send_to_address, NodeClock::now()); return tx; } @@ -95,8 +95,8 @@ std::vector PrivateBroadcast::GetStale() const LOCK(m_mutex); const auto stale_time{NodeClock::now() - STALE_DURATION}; std::vector stale; - for (const auto& [tx, send_status] : m_transactions) { - const Priority p{DerivePriority(send_status)}; + for (const auto& [tx, state] : m_transactions) { + const Priority p{DerivePriority(state.send_statuses)}; if (p.last_confirmed < stale_time) { stale.push_back(tx); } @@ -111,10 +111,10 @@ std::vector PrivateBroadcast::GetBroadcastInf std::vector entries; entries.reserve(m_transactions.size()); - for (const auto& [tx, sent_to] : m_transactions) { + for (const auto& [tx, state] : m_transactions) { std::vector peers; - peers.reserve(sent_to.size()); - for (const auto& status : sent_to) { + peers.reserve(state.send_statuses.size()); + for (const auto& status : state.send_statuses) { peers.emplace_back(PeerSendInfo{.address = status.address, .sent = status.picked, .received = status.confirmed}); } entries.emplace_back(TxBroadcastInfo{.tx = tx, .peers = std::move(peers)}); @@ -141,8 +141,8 @@ std::optional PrivateBroadcast::GetSen EXCLUSIVE_LOCKS_REQUIRED(m_mutex) { AssertLockHeld(m_mutex); - for (auto& [tx, sent_to] : m_transactions) { - for (auto& send_status : sent_to) { + for (auto& [tx, state] : m_transactions) { + for (auto& send_status : state.send_statuses) { if (send_status.nodeid == nodeid) { return TxAndSendStatusForNode{.tx = tx, .send_status = send_status}; } diff --git a/src/private_broadcast.h b/src/private_broadcast.h index 286344248d9..27f421661af 100644 --- a/src/private_broadcast.h +++ b/src/private_broadcast.h @@ -177,9 +177,12 @@ private: */ std::optional GetSendStatusByNode(const NodeId& nodeid) EXCLUSIVE_LOCKS_REQUIRED(m_mutex); - + struct TxSendStatus { + const NodeClock::time_point time_added{NodeClock::now()}; + std::vector send_statuses; + }; mutable Mutex m_mutex; - std::unordered_map, CTransactionRefHash, CTransactionRefComp> + std::unordered_map m_transactions GUARDED_BY(m_mutex); };