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:
parent
5eb3fc29bb
commit
b5b72ae05c
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user