From e1cabb31e26e0dfc39d2ad83fc51a111f37c0ac0 Mon Sep 17 00:00:00 2001 From: Colin LeMahieu Date: Sat, 13 Apr 2024 11:47:43 +0100 Subject: [PATCH] Use temporary expression ledger transactions to avoid long-running and recursive transaction opening. In this algorithm the receivable_iterator was not incremented so the stored transaction was not used. The outer loop already re-opens the transaction in order to get an up-to-date view of the ledger. --- nano/node/epoch_upgrader.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/nano/node/epoch_upgrader.cpp b/nano/node/epoch_upgrader.cpp index c4f683d49..5ac75b436 100644 --- a/nano/node/epoch_upgrader.cpp +++ b/nano/node/epoch_upgrader.cpp @@ -134,9 +134,8 @@ void nano::epoch_upgrader::upgrade_impl (nano::raw_key const & prv_a, nano::epoc uint64_t attempts (0); for (auto i (accounts_list.get ().begin ()), n (accounts_list.get ().end ()); i != n && attempts < upgrade_batch_size && attempts < count_limit && !stopped; ++i) { - auto transaction (store.tx_begin_read ()); nano::account const & account (i->account); - auto info = ledger.account_info (transaction, account); + auto info = ledger.account_info (ledger.store.tx_begin_read (), account); if (info && info->epoch () < epoch_a) { ++attempts; @@ -210,11 +209,10 @@ void nano::epoch_upgrader::upgrade_impl (nano::raw_key const & prv_a, nano::epoc std::atomic upgraded_pending (0); uint64_t workers (0); uint64_t attempts (0); - auto transaction = store.tx_begin_read (); - for (auto current = ledger.receivable_upper_bound (transaction, 0), end = ledger.receivable_end (); current != end && attempts < upgrade_batch_size && attempts < count_limit && !stopped;) + for (auto current = ledger.receivable_upper_bound (ledger.store.tx_begin_read (), 0), end = ledger.receivable_end (); current != end && attempts < upgrade_batch_size && attempts < count_limit && !stopped;) { auto const & [key, info] = *current; - if (!store.account.exists (transaction, key.account)) + if (!store.account.exists (ledger.store.tx_begin_read (), key.account)) { if (info.epoch < epoch_a) { @@ -257,7 +255,7 @@ void nano::epoch_upgrader::upgrade_impl (nano::raw_key const & prv_a, nano::epoc } } // Move to next pending item - current = ledger.receivable_upper_bound (transaction, key.account, key.hash); + current = ledger.receivable_upper_bound (ledger.store.tx_begin_read (), key.account, key.hash); } else { @@ -268,7 +266,7 @@ void nano::epoch_upgrader::upgrade_impl (nano::raw_key const & prv_a, nano::epoc } else { - current = ledger.receivable_upper_bound (transaction, key.account); + current = ledger.receivable_upper_bound (ledger.store.tx_begin_read (), key.account); } } }