[refactor] batch-add transactions to DisconnectedBlockTransactions

No behavior change.
In a future commit, we can optimize by reserving vtx.size().
pull/28385/head
glozow 1 year ago
parent 5666966dff
commit 925bb723ca

@ -892,10 +892,18 @@ struct DisconnectedBlockTransactions {
return memusage::MallocUsage(sizeof(CTransactionRef) + 6 * sizeof(void*)) * queuedTx.size() + cachedInnerUsage; return memusage::MallocUsage(sizeof(CTransactionRef) + 6 * sizeof(void*)) * queuedTx.size() + cachedInnerUsage;
} }
void addTransaction(const CTransactionRef& tx) /** Add transactions from the block, iterating through vtx in reverse order. Callers should call
* this function for blocks in descending order by block height.
* We assume that callers never pass multiple transactions with the same txid, otherwise things
* can go very wrong in removeForBlock due to queuedTx containing an item without a
* corresponding entry in iters_by_txid.
*/
void AddTransactionsFromBlock(const std::vector<CTransactionRef>& vtx)
{ {
queuedTx.insert(tx); for (auto block_it = vtx.rbegin(); block_it != vtx.rend(); ++block_it) {
cachedInnerUsage += RecursiveDynamicUsage(tx); queuedTx.insert(*block_it);
cachedInnerUsage += RecursiveDynamicUsage(*block_it);
}
} }
// Remove entries based on txid_index, and update memory usage. // Remove entries based on txid_index, and update memory usage.

@ -2721,9 +2721,7 @@ bool Chainstate::DisconnectTip(BlockValidationState& state, DisconnectedBlockTra
if (disconnectpool && m_mempool) { if (disconnectpool && m_mempool) {
// Save transactions to re-add to mempool at end of reorg // Save transactions to re-add to mempool at end of reorg
for (auto it = block.vtx.rbegin(); it != block.vtx.rend(); ++it) { disconnectpool->AddTransactionsFromBlock(block.vtx);
disconnectpool->addTransaction(*it);
}
while (disconnectpool->DynamicMemoryUsage() > MAX_DISCONNECTED_TX_POOL_SIZE * 1000) { while (disconnectpool->DynamicMemoryUsage() > MAX_DISCONNECTED_TX_POOL_SIZE * 1000) {
// Drop the earliest entry, and remove its children from the mempool. // Drop the earliest entry, and remove its children from the mempool.
auto it = disconnectpool->queuedTx.get<insertion_order>().begin(); auto it = disconnectpool->queuedTx.get<insertion_order>().begin();

Loading…
Cancel
Save