18 const bool inserted{m_transactions.try_emplace(tx).second};
26 const auto handle{m_transactions.extract(tx)};
28 const auto p{DerivePriority(handle.mapped())};
29 return p.num_confirmed;
39 const auto it{std::ranges::max_element(
41 [](
const auto& a,
const auto& b) {
return a < b; },
42 [](
const auto& el) {
return DerivePriority(el.second); })};
44 if (it != m_transactions.end()) {
45 auto& [tx, sent_to]{*it};
57 const auto tx_and_status{GetSendStatusByNode(nodeid)};
58 if (tx_and_status.has_value()) {
59 return tx_and_status.value().tx;
68 const auto tx_and_status{GetSendStatusByNode(nodeid)};
69 if (tx_and_status.has_value()) {
78 const auto tx_and_status{GetSendStatusByNode(nodeid)};
79 if (tx_and_status.has_value()) {
80 return tx_and_status.value().send_status.confirmed.has_value();
89 return !m_transactions.empty();
97 std::vector<CTransactionRef> stale;
98 for (
const auto& [tx, send_status] : m_transactions) {
100 if (p.last_confirmed < stale_time) {
111 for (
const auto& send_status : sent_to) {
113 if (send_status.confirmed.has_value()) {
125 for (
auto& [tx, sent_to] : m_transactions) {
126 for (
auto& send_status : sent_to) {
127 if (send_status.nodeid == nodeid) {
static Priority DerivePriority(const std::vector< SendStatus > &sent_to)
Derive the sending priority of a transaction.
void NodeConfirmedReception(const NodeId &nodeid) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Mark that the node has confirmed reception of the transaction we sent it by responding with PONG to o...
bool HavePendingTransactions() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Check if there are transactions that need to be broadcast.
bool DidNodeConfirmReception(const NodeId &nodeid) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Check if the node has confirmed reception of the transaction.
std::optional< size_t > Remove(const CTransactionRef &tx) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Forget a transaction.
std::optional< CTransactionRef > PickTxForSend(const NodeId &will_send_to_nodeid) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Pick the transaction with the fewest send attempts, and confirmations, and oldest send/confirm times.
std::optional< TxAndSendStatusForNode > GetSendStatusByNode(const NodeId &nodeid) EXCLUSIVE_LOCKS_REQUIRED(m_mutex)
Find which transaction we sent to a given node (marked by PickTxForSend()).
std::optional< CTransactionRef > GetTxForNode(const NodeId &nodeid) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Get the transaction that was picked for sending to a given node by PickTxForSend().
bool Add(const CTransactionRef &tx) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Add a transaction to the storage.
std::vector< CTransactionRef > GetStale() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Get the transactions that have not been broadcast recently.
std::shared_ptr< const CTransaction > CTransactionRef
static constexpr auto STALE_DURATION
If a transaction is not received back from the network for this duration after it is broadcast,...
static time_point now() noexcept
Return current system time or mocked time, if set.
Cumulative stats from all the send attempts for a transaction. Used to prioritize transactions.
size_t num_picked
Number of times the transaction was picked for sending.
NodeClock::time_point last_confirmed
The most recent time when the transaction was confirmed.
size_t num_confirmed
Number of nodes that have confirmed reception of a transaction (by PONG).
NodeClock::time_point last_picked
The most recent time when the transaction was picked for sending.
A pair of a transaction and a sent status for a given node. Convenience return type of GetSendStatusB...
const CTransactionRef & tx
#define EXCLUSIVE_LOCKS_REQUIRED(...)