continue pool pruning even if a tx can't be found

This commit is contained in:
j-berman 2022-07-01 08:30:49 -07:00
parent 9750e1fa10
commit 628fdcdd49
2 changed files with 31 additions and 5 deletions

View File

@ -402,6 +402,19 @@ namespace cryptonote
m_txpool_max_weight = bytes; m_txpool_max_weight = bytes;
} }
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
void tx_memory_pool::reduce_txpool_weight(size_t weight)
{
if (weight > m_txpool_weight)
{
MERROR("Underflow in txpool weight");
m_txpool_weight = 0;
}
else
{
m_txpool_weight -= weight;
}
}
//---------------------------------------------------------------------------------
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);
@ -423,8 +436,14 @@ namespace cryptonote
txpool_tx_meta_t meta; txpool_tx_meta_t meta;
if (!m_blockchain.get_txpool_tx_meta(txid, meta)) if (!m_blockchain.get_txpool_tx_meta(txid, meta))
{ {
MERROR("Failed to find tx_meta in txpool"); static bool warned = false;
return; if (!warned)
{
MERROR("Failed to find tx_meta in txpool (will only print once)");
warned = true;
}
--it;
continue;
} }
// don't prune the kept_by_block ones, they're likely added because we're adding a block with those // don't prune the kept_by_block ones, they're likely added because we're adding a block with those
if (meta.kept_by_block) if (meta.kept_by_block)
@ -442,7 +461,7 @@ namespace cryptonote
// remove first, in case this throws, so key images aren't removed // remove first, in case this throws, so key images aren't removed
MINFO("Pruning tx " << txid << " from txpool: weight: " << meta.weight << ", fee/byte: " << it->first.first); MINFO("Pruning tx " << txid << " from txpool: weight: " << meta.weight << ", fee/byte: " << it->first.first);
m_blockchain.remove_txpool_tx(txid); m_blockchain.remove_txpool_tx(txid);
m_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);
m_txs_by_fee_and_receive_time.erase(it--); m_txs_by_fee_and_receive_time.erase(it--);
@ -562,7 +581,7 @@ namespace cryptonote
// remove first, in case this throws, so key images aren't removed // remove first, in case this throws, so key images aren't removed
m_blockchain.remove_txpool_tx(id); m_blockchain.remove_txpool_tx(id);
m_txpool_weight -= tx_weight; reduce_txpool_weight(tx_weight);
remove_transaction_keyimages(tx, id); remove_transaction_keyimages(tx, id);
lock.commit(); lock.commit();
} }
@ -725,7 +744,7 @@ namespace cryptonote
{ {
// remove first, so we only remove key images if the tx removal succeeds // remove first, so we only remove key images if the tx removal succeeds
m_blockchain.remove_txpool_tx(txid); m_blockchain.remove_txpool_tx(txid);
m_txpool_weight -= entry.second; reduce_txpool_weight(entry.second);
remove_transaction_keyimages(tx, txid); remove_transaction_keyimages(tx, txid);
} }
} }

View File

@ -406,6 +406,13 @@ namespace cryptonote
*/ */
void set_txpool_max_weight(size_t bytes); void set_txpool_max_weight(size_t bytes);
/**
* @brief reduce the cumulative txpool weight by the weight provided
*
* @param weight the weight to reduce the total txpool weight by
*/
void reduce_txpool_weight(size_t weight);
#define CURRENT_MEMPOOL_ARCHIVE_VER 11 #define CURRENT_MEMPOOL_ARCHIVE_VER 11
#define CURRENT_MEMPOOL_TX_DETAILS_ARCHIVE_VER 13 #define CURRENT_MEMPOOL_TX_DETAILS_ARCHIVE_VER 13