From 96aa93882704bf0f61523c8b3c36e721328d8b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20W=C3=B3jcik?= <3044353+pwojcikdev@users.noreply.github.com> Date: Tue, 14 Feb 2023 18:52:34 +0100 Subject: [PATCH] Avoid unnecessarily held lock in `backlog_population` (#4126) --- nano/node/backlog_population.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/nano/node/backlog_population.cpp b/nano/node/backlog_population.cpp index 0efd47b31..3b3989bfa 100644 --- a/nano/node/backlog_population.cpp +++ b/nano/node/backlog_population.cpp @@ -29,9 +29,10 @@ void nano::backlog_population::start () void nano::backlog_population::stop () { - nano::unique_lock lock{ mutex }; - stopped = true; - lock.unlock (); + { + nano::lock_guard lock{ mutex }; + stopped = true; + } notify (); nano::join_or_pass (thread); } @@ -85,6 +86,7 @@ void nano::backlog_population::populate_backlog (nano::unique_lock while (!stopped && !done) { lock.unlock (); + { auto transaction = store.tx_begin_read (); @@ -101,9 +103,11 @@ void nano::backlog_population::populate_backlog (nano::unique_lock } done = store.account.begin (transaction, next) == end; } + lock.lock (); + // Give the rest of the node time to progress without holding database lock - std::this_thread::sleep_for (std::chrono::milliseconds (1000 / config_m.frequency)); + condition.wait_for (lock, std::chrono::milliseconds{ 1000 / config_m.frequency }); } }