Skip to content

Commit

Permalink
Rewrite priority scheduler in terms of ledger_view.
Browse files Browse the repository at this point in the history
  • Loading branch information
clemahieu committed Mar 27, 2024
1 parent 5b8a430 commit 55ac5d9
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 33 deletions.
59 changes: 26 additions & 33 deletions nano/node/scheduler/priority.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <nano/node/scheduler/buckets.hpp>
#include <nano/node/scheduler/priority.hpp>
#include <nano/secure/ledger.hpp>
#include <nano/secure/ledger_view_confirmed.hpp>
#include <nano/secure/ledger_view_unconfirmed.hpp>

nano::scheduler::priority::priority (nano::node & node_a, nano::stats & stats_a) :
Expand Down Expand Up @@ -40,42 +41,34 @@ void nano::scheduler::priority::stop ()
nano::join_or_pass (thread);
}

bool nano::scheduler::priority::activate (nano::account const & account_a, store::transaction const & transaction)
bool nano::scheduler::priority::activate (nano::account const & account, store::transaction const & transaction)
{
debug_assert (!account_a.is_zero ());
auto info = node.ledger->get (transaction, account_a);
if (info)
debug_assert (!account.is_zero ());
auto head = node.ledger.confirmed ().head (transaction, account);
if (node.ledger->head (transaction, account) == head)
{
nano::confirmation_height_info conf_info;
node.store.confirmation_height.get (transaction, account_a, conf_info);
if (conf_info.height < info->block_count)
{
debug_assert (conf_info.frontier != info->head);
auto hash = conf_info.height == 0 ? info->open_block : node.ledger->successor (transaction, conf_info.frontier).value_or (0);
auto block = node.ledger->get (transaction, hash);
debug_assert (block != nullptr);
if (node.ledger.dependents_confirmed (transaction, *block))
{
auto const balance = node.ledger->balance (transaction, hash).value ();
auto const previous_balance = node.ledger->balance (transaction, conf_info.frontier).value_or (0);
auto const balance_priority = std::max (balance, previous_balance);

node.stats.inc (nano::stat::type::election_scheduler, nano::stat::detail::activated);
node.logger.trace (nano::log::type::election_scheduler, nano::log::detail::block_activated,
nano::log::arg{ "account", account_a.to_account () }, // TODO: Convert to lazy eval
nano::log::arg{ "block", block },
nano::log::arg{ "time", info->modified },
nano::log::arg{ "priority", balance_priority });

nano::lock_guard<nano::mutex> lock{ mutex };
buckets->push (info->modified, block, balance_priority);
notify ();

return true; // Activated
}
}
return false;
}
auto block = node.ledger->get (transaction, node.ledger->successor (transaction, { head.is_zero () ? static_cast<nano::uint256_union> (account) : head, head }).value ());
if (!node.ledger.dependents_confirmed (transaction, *block))
{
return false;
}
return false; // Not activated
auto const balance_priority = std::max (block->balance ().number (), node.ledger.confirmed ().balance (transaction, head).value_or (0));
auto const time_priority = !head.is_zero () ? node.ledger.confirmed ().get (transaction, head)->sideband ().timestamp : nano::seconds_since_epoch (); // New accounts get current timestamp i.e. lowest priority

node.stats.inc (nano::stat::type::election_scheduler, nano::stat::detail::activated);
node.logger.trace (nano::log::type::election_scheduler, nano::log::detail::block_activated,
nano::log::arg{ "account", account.to_account () }, // TODO: Convert to lazy eval
nano::log::arg{ "block", block },
nano::log::arg{ "time", time_priority },
nano::log::arg{ "priority", balance_priority });

nano::lock_guard<nano::mutex> lock{ mutex };
buckets->push (time_priority, block, balance_priority);
notify ();

return true; // Activated
}

void nano::scheduler::priority::notify ()
Expand Down
15 changes: 15 additions & 0 deletions nano/secure/ledger_view_confirmed.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,21 @@ std::optional<nano::uint128_t> nano::ledger_view_confirmed::balance (store::tran
return block->balance ().number ();
}

// Balance for account containing hash
std::optional<nano::uint128_t> nano::ledger_view_confirmed::balance (store::transaction const & transaction, nano::block_hash const & hash) const
{
if (hash.is_zero ())
{
return std::nullopt;
}
auto block = get (transaction, hash);
if (!block)
{
return std::nullopt;
}
return block->balance ().number ();
}

bool nano::ledger_view_confirmed::exists (store::transaction const & transaction, nano::block_hash const & hash) const
{
auto block = ledger.store.block.get (transaction, hash);
Expand Down
1 change: 1 addition & 0 deletions nano/secure/ledger_view_confirmed.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class ledger_view_confirmed
ledger_view_confirmed (nano::ledger const & ledger);

std::optional<nano::uint128_t> balance (store::transaction const & transaction, nano::account const & account) const;
std::optional<nano::uint128_t> balance (store::transaction const & transaction, nano::block_hash const & hash) const;
bool exists (store::transaction const & transaction, nano::block_hash const & hash) const;
bool exists_or_pruned (store::transaction const & transaction, nano::block_hash const & hash) const;
std::optional<nano::account_info> get (store::transaction const & transaction, nano::account const & account) const;
Expand Down

0 comments on commit 55ac5d9

Please sign in to comment.