Refactor total stats calculation into shared fn (#21212)
This commit is contained in:
parent
3c5f505d3e
commit
8b2133b078
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue