From 92df37bc053ade591d24c41de1dd00b2abd8a162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wo=CC=81jcik?= <3044353+pwojcikdev@users.noreply.github.com> Date: Fri, 23 Aug 2024 10:12:40 +0200 Subject: [PATCH] Avoid long held transactions during backlog population --- nano/node/backlog_population.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/nano/node/backlog_population.cpp b/nano/node/backlog_population.cpp index c49a5ebc..89965282 100644 --- a/nano/node/backlog_population.cpp +++ b/nano/node/backlog_population.cpp @@ -95,19 +95,26 @@ void nano::backlog_population::populate_backlog (nano::unique_lock { auto transaction = ledger.tx_begin_read (); - auto count = 0u; - auto i = ledger.store.account.begin (transaction, next); + auto it = ledger.store.account.begin (transaction, next); auto const end = ledger.store.account.end (); - for (; i != end && count < chunk_size; ++i, ++count, ++total) + + auto should_refresh = [&transaction] () { + auto cutoff = std::chrono::steady_clock::now () - 100ms; // TODO: Make this configurable + return transaction.timestamp () < cutoff; + }; + + for (size_t count = 0; it != end && count < chunk_size && !should_refresh (); ++it, ++count, ++total) { stats.inc (nano::stat::type::backlog, nano::stat::detail::total); - auto const & account = i->first; - auto const & account_info = i->second; + auto const & account = it->first; + auto const & account_info = it->second; + activate (transaction, account, account_info); next = account.number () + 1; } + done = ledger.store.account.begin (transaction, next) == end; }