Fixed mempool pruning

- Fixed undefined behavior after a call to `remove_tx_from_transient_lists` (it used an invalid iterator)
- Fixed `txCompare` (it wasn't strictly weak ordered)
This commit is contained in:
SChernykh 2024-03-08 20:58:21 +01:00
parent 5eb3fc29bb
commit b5b72ae05c
2 changed files with 19 additions and 7 deletions

View file

@ -436,8 +436,14 @@ namespace cryptonote
void tx_memory_pool::prune(size_t bytes) void tx_memory_pool::prune(size_t bytes)
{ {
CRITICAL_REGION_LOCAL(m_transactions_lock); CRITICAL_REGION_LOCAL(m_transactions_lock);
// Nothing to do if already empty
if (m_txs_by_fee_and_receive_time.empty())
return;
if (bytes == 0) if (bytes == 0)
bytes = m_txpool_max_weight; bytes = m_txpool_max_weight;
CRITICAL_REGION_LOCAL1(m_blockchain); CRITICAL_REGION_LOCAL1(m_blockchain);
LockedTXN lock(m_blockchain.get_db()); LockedTXN lock(m_blockchain.get_db());
bool changed = false; bool changed = false;
@ -482,8 +488,13 @@ namespace cryptonote
reduce_txpool_weight(meta.weight); reduce_txpool_weight(meta.weight);
remove_transaction_keyimages(tx, txid); remove_transaction_keyimages(tx, txid);
MINFO("Pruned tx " << txid << " from txpool: weight: " << meta.weight << ", fee/byte: " << it->first.first); MINFO("Pruned tx " << txid << " from txpool: weight: " << meta.weight << ", fee/byte: " << it->first.first);
auto it_prev = it;
--it_prev;
remove_tx_from_transient_lists(it, txid, !meta.matches(relay_category::broadcasted)); remove_tx_from_transient_lists(it, txid, !meta.matches(relay_category::broadcasted));
it--; it = it_prev;
changed = true; changed = true;
} }
catch (const std::exception &e) catch (const std::exception &e)
@ -1828,7 +1839,7 @@ namespace cryptonote
auto sorted_it = find_tx_in_sorted_container(txid); auto sorted_it = find_tx_in_sorted_container(txid);
if (sorted_it == m_txs_by_fee_and_receive_time.end()) if (sorted_it == m_txs_by_fee_and_receive_time.end())
{ {
MERROR("Re-adding tx " << txid << " to tx pool, but it was not found in the sorted txs container"); MDEBUG("Re-adding tx " << txid << " to tx pool, but it was not found in the sorted txs container");
} }
else else
{ {

View file

@ -69,11 +69,12 @@ namespace cryptonote
{ {
// sort by greatest first, not least // sort by greatest first, not least
if (a.first.first > b.first.first) return true; if (a.first.first > b.first.first) return true;
else if (a.first.first < b.first.first) return false; if (a.first.first < b.first.first) return false;
else if (a.first.second < b.first.second) return true;
else if (a.first.second > b.first.second) return false; if (a.first.second < b.first.second) return true;
else if (a.second != b.second) return true; if (a.first.second > b.first.second) return false;
else return false;
return memcmp(a.second.data, b.second.data, sizeof(crypto::hash)) < 0;
} }
}; };