From d58316451abd507a5a328ffc024651fa8a129ba2 Mon Sep 17 00:00:00 2001 From: Colin LeMahieu Date: Sat, 16 Mar 2024 19:24:17 +0000 Subject: [PATCH] Rewrite json_handler::unopened in terms of receivable iterators The algorithm had a non-trivial change to implementation. The intent is to sum the amount of balance receivable for given set of accounts. The region selected starts at "account" and ends when "count" is reached. --- nano/node/json_handler.cpp | 50 ++++++++++++-------------------------- 1 file changed, 15 insertions(+), 35 deletions(-) diff --git a/nano/node/json_handler.cpp b/nano/node/json_handler.cpp index c5b6d5056..230638b71 100644 --- a/nano/node/json_handler.cpp +++ b/nano/node/json_handler.cpp @@ -4238,7 +4238,7 @@ void nano::json_handler::unopened () { auto count (count_optional_impl ()); auto threshold (threshold_optional_impl ()); - nano::account start (1); // exclude burn account by default + nano::account start{ 1 }; // exclude burn account by default boost::optional account_text (request.get_optional ("account")); if (account_text.is_initialized ()) { @@ -4246,48 +4246,28 @@ void nano::json_handler::unopened () } if (!ec) { - auto transaction (node.store.tx_begin_read ()); - auto iterator (node.store.pending.begin (transaction, nano::pending_key (start, 0))); - auto end (node.store.pending.end ()); - nano::account current_account (start); - nano::uint128_t current_account_sum{ 0 }; + auto transaction = node.store.tx_begin_read (); + auto & ledger = node.ledger; boost::property_tree::ptree accounts; - while (iterator != end && accounts.size () < count) + for (auto iterator = ledger.receivable_upper_bound (transaction, start, 0), end = ledger.receivable_end (); iterator != end && accounts.size () < count;) { - nano::pending_key key (iterator->first); - nano::account account (key.account); - nano::pending_info info (iterator->second); - if (node.store.account.exists (transaction, account)) + auto const & [key, info] = *iterator; + nano::account account = key.account; + if (!node.store.account.exists (transaction, account)) { - if (account.number () == std::numeric_limits::max ()) + nano::uint128_t current_account_sum{ 0 }; + while (iterator != end) { - break; + auto const & [key, info] = *iterator; + current_account_sum += info.amount.number (); + ++iterator; } - // Skip existing accounts - iterator = node.store.pending.begin (transaction, nano::pending_key (account.number () + 1, 0)); - } - else - { - if (account != current_account) + if (current_account_sum >= threshold.number ()) { - if (current_account_sum > 0) - { - if (current_account_sum >= threshold.number ()) - { - accounts.put (current_account.to_account (), current_account_sum.convert_to ()); - } - current_account_sum = 0; - } - current_account = account; + accounts.put (account.to_account (), current_account_sum.convert_to ()); } - current_account_sum += info.amount.number (); - ++iterator; } - } - // last one after iterator reaches end - if (accounts.size () < count && current_account_sum > 0 && current_account_sum >= threshold.number ()) - { - accounts.put (current_account.to_account (), current_account_sum.convert_to ()); + iterator = ledger.receivable_upper_bound (transaction, account); } response_l.add_child ("accounts", accounts); }