Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

accounts-db/report number of duplicated accounts found in shrinking #1884

Merged
merged 2 commits into from
Jun 27, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 29 additions & 2 deletions accounts-db/src/accounts_db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,7 @@ impl AccountFromStorage {
pub struct GetUniqueAccountsResult {
pub stored_accounts: Vec<AccountFromStorage>,
pub capacity: u64,
pub num_duplicated_accounts: usize,
}

pub struct AccountsAddRootTiming {
Expand Down Expand Up @@ -1986,6 +1987,7 @@ pub struct ShrinkStats {
last_report: AtomicInterval,
pub(crate) num_slots_shrunk: AtomicUsize,
storage_read_elapsed: AtomicU64,
num_duplicated_accounts: AtomicU64,
index_read_elapsed: AtomicU64,
create_and_insert_store_elapsed: AtomicU64,
store_accounts_elapsed: AtomicU64,
Expand Down Expand Up @@ -2020,6 +2022,11 @@ impl ShrinkStats {
self.storage_read_elapsed.swap(0, Ordering::Relaxed) as i64,
i64
),
(
"num_duplicated_accounts",
self.num_duplicated_accounts.swap(0, Ordering::Relaxed),
i64
),
(
"index_read_elapsed",
self.index_read_elapsed.swap(0, Ordering::Relaxed) as i64,
Expand Down Expand Up @@ -2119,6 +2126,13 @@ impl ShrinkAncientStats {
.swap(0, Ordering::Relaxed) as i64,
i64
),
(
"num_duplicated_accounts",
self.shrink_stats
.num_duplicated_accounts
.swap(0, Ordering::Relaxed),
i64
),
(
"index_read_elapsed",
self.shrink_stats
Expand Down Expand Up @@ -3900,19 +3914,21 @@ impl AccountsDb {
});

// sort by pubkey to keep account index lookups close
Self::sort_and_remove_dups(&mut stored_accounts);
let num_duplicated_accounts = Self::sort_and_remove_dups(&mut stored_accounts);

GetUniqueAccountsResult {
stored_accounts,
capacity,
num_duplicated_accounts,
}
}

/// sort `accounts` by pubkey.
/// Remove earlier entries with the same pubkey as later entries.
fn sort_and_remove_dups(accounts: &mut Vec<AccountFromStorage>) {
fn sort_and_remove_dups(accounts: &mut Vec<AccountFromStorage>) -> usize {
// stable sort because we want the most recent only
accounts.sort_by(|a, b| a.pubkey().cmp(b.pubkey()));
let len0 = accounts.len();
if accounts.len() > 1 {
let mut i = 0;
// iterate 0..1 less than end
Expand All @@ -3928,6 +3944,7 @@ impl AccountsDb {
i += 1;
}
}
len0 - accounts.len()
}

pub(crate) fn get_unique_accounts_from_storage_for_shrink(
Expand All @@ -3940,6 +3957,9 @@ impl AccountsDb {
stats
.storage_read_elapsed
.fetch_add(storage_read_elapsed_us, Ordering::Relaxed);
stats
.num_duplicated_accounts
.fetch_add(result.num_duplicated_accounts as u64, Ordering::Relaxed);
result
}

Expand All @@ -3956,6 +3976,7 @@ impl AccountsDb {
let GetUniqueAccountsResult {
stored_accounts,
capacity,
num_duplicated_accounts,
} = unique_accounts;

let mut index_read_elapsed = Measure::start("index_read_elapsed");
Expand All @@ -3966,6 +3987,9 @@ impl AccountsDb {
stats
.accounts_loaded
.fetch_add(len as u64, Ordering::Relaxed);
stats
.num_duplicated_accounts
.fetch_add(*num_duplicated_accounts as u64, Ordering::Relaxed);
let all_are_zero_lamports_collect = Mutex::new(true);
let index_entries_being_shrunk_outer = Mutex::new(Vec::default());
self.thread_pool_clean.install(|| {
Expand Down Expand Up @@ -17139,6 +17163,7 @@ pub mod tests {
let GetUniqueAccountsResult {
stored_accounts: after_stored_accounts,
capacity: after_capacity,
..
} = db.get_unique_accounts_from_storage(&after_store);
assert!(created_accounts.capacity <= after_capacity);
assert_eq!(created_accounts.stored_accounts.len(), 1);
Expand All @@ -17153,6 +17178,7 @@ pub mod tests {
let GetUniqueAccountsResult {
stored_accounts: after_stored_accounts,
capacity: after_capacity,
..
} = db.get_unique_accounts_from_storage(&after_store);
assert!(created_accounts.capacity <= after_capacity);
assert_eq!(created_accounts.stored_accounts.len(), 1);
Expand Down Expand Up @@ -17629,6 +17655,7 @@ pub mod tests {
let GetUniqueAccountsResult {
stored_accounts: after_stored_accounts,
capacity: after_capacity,
..
} = db.get_unique_accounts_from_storage(&after_store);
if alive {
assert!(created_accounts.capacity <= after_capacity);
Expand Down