Refactor total stats calculation into shared fn (#21212)

This commit is contained in:
Brooks Prumo 2021-11-09 19:13:37 -06:00 committed by GitHub
parent 3c5f505d3e
commit 8b2133b078
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 44 deletions

View File

@ -28,7 +28,7 @@ use solana_measure::measure::Measure;
use solana_runtime::{ use solana_runtime::{
accounts_db::AccountsDbConfig, accounts_db::AccountsDbConfig,
accounts_index::AccountsIndexConfig, accounts_index::AccountsIndexConfig,
bank::{Bank, RewardCalculationEvent, TotalAccountsStats}, bank::{Bank, RewardCalculationEvent},
bank_forks::BankForks, bank_forks::BankForks,
cost_model::CostModel, cost_model::CostModel,
cost_tracker::CostTracker, cost_tracker::CostTracker,
@ -2509,26 +2509,21 @@ fn main() {
measure.stop(); measure.stop();
info!("{}", measure); info!("{}", measure);
let print_account_contents = !arg_matches.is_present("no_account_contents"); let mut measure = Measure::start("calculating total accounts stats");
let print_account_data = !arg_matches.is_present("no_account_data"); let total_accounts_stats = bank.calculate_total_accounts_stats(
let rent_collector = bank.rent_collector(); accounts
let mut total_accounts_stats = TotalAccountsStats::default(); .iter()
let mut measure = Measure::start("processing accounts"); .map(|(pubkey, (account, _slot))| (pubkey, account)),
for (pubkey, (account, slot)) in accounts.into_iter() { );
let data_len = account.data().len(); measure.stop();
total_accounts_stats.num_accounts += 1; info!("{}", measure);
total_accounts_stats.data_len += data_len;
if account.executable() {
total_accounts_stats.num_executable_accounts += 1;
total_accounts_stats.executable_data_len += data_len;
}
if !rent_collector.should_collect_rent(&pubkey, &account, false)
|| rent_collector.get_rent_due(&account).1
{
total_accounts_stats.num_rent_exempt_accounts += 1;
}
if print_account_contents { let print_account_contents = !arg_matches.is_present("no_account_contents");
if print_account_contents {
let print_account_data = !arg_matches.is_present("no_account_data");
let mut measure = Measure::start("printing account contents");
for (pubkey, (account, slot)) in accounts.into_iter() {
let data_len = account.data().len();
println!("{}:", pubkey); println!("{}:", pubkey);
println!(" - balance: {} SOL", lamports_to_sol(account.lamports())); println!(" - balance: {} SOL", lamports_to_sol(account.lamports()));
println!(" - owner: '{}'", account.owner()); println!(" - owner: '{}'", account.owner());
@ -2540,9 +2535,9 @@ fn main() {
} }
println!(" - data_len: {}", data_len); println!(" - data_len: {}", data_len);
} }
measure.stop();
info!("{}", measure);
} }
measure.stop();
info!("{}", measure);
println!("{:#?}", total_accounts_stats); println!("{:#?}", total_accounts_stats);
} }

View File

@ -6320,33 +6320,48 @@ impl Bank {
self.feature_set self.feature_set
.is_active(&feature_set::rent_for_sysvars::id()) .is_active(&feature_set::rent_for_sysvars::id())
} }
}
/// Scan all the accounts for this bank and collect stats /// Get all the accounts for this bank and calculate stats
pub fn get_total_accounts_stats(bank: &Bank) -> ScanResult<TotalAccountsStats> { pub fn get_total_accounts_stats(&self) -> ScanResult<TotalAccountsStats> {
let rent_collector = bank.rent_collector(); let accounts = self.get_all_accounts_with_modified_slots()?;
bank.rc.accounts.accounts_db.scan_accounts( Ok(self.calculate_total_accounts_stats(
&Ancestors::default(), accounts
bank.bank_id(), .iter()
|total_accounts_stats: &mut TotalAccountsStats, item| { .map(|(pubkey, account, _slot)| (pubkey, account)),
if let Some((pubkey, account, _slot)) = item { ))
total_accounts_stats.num_accounts += 1; }
total_accounts_stats.data_len += account.data().len();
if account.executable() { /// Given all the accounts for a bank, calculate stats
total_accounts_stats.num_executable_accounts += 1; pub fn calculate_total_accounts_stats<'a>(
total_accounts_stats.executable_data_len += account.data().len(); &self,
} accounts: impl Iterator<Item = (&'a Pubkey, &'a AccountSharedData)>,
) -> TotalAccountsStats {
let rent_collector = self.rent_collector();
let mut total_accounts_stats = TotalAccountsStats::default();
accounts.for_each(|(pubkey, account)| {
let data_len = account.data().len();
total_accounts_stats.num_accounts += 1;
total_accounts_stats.data_len += data_len;
if !rent_collector.should_collect_rent(pubkey, &account, false) || { if account.executable() {
let (_rent_due, exempt) = rent_collector.get_rent_due(&account); total_accounts_stats.num_executable_accounts += 1;
exempt total_accounts_stats.executable_data_len += data_len;
} { }
total_accounts_stats.num_rent_exempt_accounts += 1;
if !rent_collector.should_collect_rent(pubkey, account, false)
|| rent_collector.get_rent_due(account).1
{
total_accounts_stats.num_rent_exempt_accounts += 1;
} else {
total_accounts_stats.num_rent_paying_accounts += 1;
if data_len == 0 {
total_accounts_stats.num_rent_paying_accounts_without_data += 1;
} }
} }
}, });
)
total_accounts_stats
}
} }
/// Struct to collect stats when scanning all accounts in `get_total_accounts_stats()` /// Struct to collect stats when scanning all accounts in `get_total_accounts_stats()`
@ -6364,6 +6379,10 @@ pub struct TotalAccountsStats {
/// Total number of rent exempt accounts /// Total number of rent exempt accounts
pub num_rent_exempt_accounts: usize, pub num_rent_exempt_accounts: usize,
/// Total number of rent paying accounts
pub num_rent_paying_accounts: usize,
/// Total number of rent paying accounts without data
pub num_rent_paying_accounts_without_data: usize,
} }
impl Drop for Bank { impl Drop for Bank {