Skip to content

Commit 0df4a2d

Browse files
authored
Remove uses of DashMap / DashSet in AccountsDb scan functions (#5836)
1 parent d86e84c commit 0df4a2d

File tree

3 files changed

+28
-33
lines changed

3 files changed

+28
-33
lines changed

accounts-db/src/accounts.rs

+3-7
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use {
99
ancestors::Ancestors,
1010
storable_accounts::StorableAccounts,
1111
},
12-
dashmap::DashMap,
1312
log::*,
1413
solana_account::{AccountSharedData, ReadableAccount},
1514
solana_address_lookup_table_interface::{
@@ -27,7 +26,7 @@ use {
2726
solana_transaction_error::TransactionResult as Result,
2827
std::{
2928
cmp::Reverse,
30-
collections::{BinaryHeap, HashSet},
29+
collections::{BinaryHeap, HashMap, HashSet},
3130
ops::RangeBounds,
3231
sync::{
3332
atomic::{AtomicUsize, Ordering},
@@ -215,7 +214,7 @@ impl Accounts {
215214
// Cache only has one version per key, don't need to worry about versioning
216215
func(loaded_account)
217216
},
218-
|accum: &DashMap<Pubkey, B>, loaded_account: &LoadedAccount, _data| {
217+
|accum: &mut HashMap<Pubkey, B>, loaded_account: &LoadedAccount, _data| {
219218
let loaded_account_pubkey = *loaded_account.pubkey();
220219
if let Some(val) = func(loaded_account) {
221220
accum.insert(loaded_account_pubkey, val);
@@ -226,10 +225,7 @@ impl Accounts {
226225

227226
match scan_result {
228227
ScanStorageResult::Cached(cached_result) => cached_result,
229-
ScanStorageResult::Stored(stored_result) => stored_result
230-
.into_iter()
231-
.map(|(_pubkey, val)| val)
232-
.collect(),
228+
ScanStorageResult::Stored(stored_result) => stored_result.into_values().collect(),
233229
}
234230
}
235231

accounts-db/src/accounts_db.rs

+12-10
Original file line numberDiff line numberDiff line change
@@ -4924,7 +4924,7 @@ impl AccountsDb {
49244924
&self,
49254925
slot: Slot,
49264926
cache_map_func: impl Fn(&LoadedAccount) -> Option<R> + Sync,
4927-
storage_scan_func: impl Fn(&B, &LoadedAccount, Option<&[u8]>) + Sync,
4927+
storage_scan_func: impl Fn(&mut B, &LoadedAccount, Option<&[u8]>) + Sync,
49284928
scan_account_storage_data: ScanAccountStorageData,
49294929
) -> ScanStorageResult<R, B>
49304930
where
@@ -4946,7 +4946,7 @@ impl AccountsDb {
49464946
&self,
49474947
slot: Slot,
49484948
cache_map_func: impl Fn(&LoadedAccount) -> Option<R> + Sync,
4949-
storage_fallback_func: impl Fn(&B, &AccountsFile) + Sync,
4949+
storage_fallback_func: impl Fn(&mut B, &AccountsFile) + Sync,
49504950
) -> ScanStorageResult<R, B>
49514951
where
49524952
R: Send,
@@ -4979,7 +4979,7 @@ impl AccountsDb {
49794979
)
49804980
}
49814981
} else {
4982-
let retval = B::default();
4982+
let mut retval = B::default();
49834983
// If the slot is not in the cache, then all the account information must have
49844984
// been flushed. This is guaranteed because we only remove the rooted slot from
49854985
// the cache *after* we've finished flushing in `flush_slot_cache`.
@@ -4996,7 +4996,7 @@ impl AccountsDb {
49964996
.storage
49974997
.get_slot_storage_entry_shrinking_in_progress_ok(slot)
49984998
{
4999-
storage_fallback_func(&retval, &storage.accounts);
4999+
storage_fallback_func(&mut retval, &storage.accounts);
50005000
}
50015001

50025002
ScanStorageResult::Stored(retval)
@@ -7472,7 +7472,7 @@ impl AccountsDb {
74727472
let scan_result = self.scan_cache_storage_fallback(
74737473
slot,
74747474
|loaded_account| Some(*loaded_account.pubkey()),
7475-
|accum: &DashSet<Pubkey>, storage| {
7475+
|accum: &mut HashSet<Pubkey>, storage| {
74767476
storage.scan_pubkeys(|pubkey| {
74777477
accum.insert(*pubkey);
74787478
});
@@ -7492,14 +7492,16 @@ impl AccountsDb {
74927492
slot: Slot,
74937493
) -> (Vec<(Pubkey, AccountHash)>, u64, Measure) {
74947494
let mut scan = Measure::start("scan");
7495-
let scan_result: ScanStorageResult<(Pubkey, AccountHash), DashMap<Pubkey, AccountHash>> =
7495+
let scan_result: ScanStorageResult<(Pubkey, AccountHash), HashMap<Pubkey, AccountHash>> =
74967496
self.scan_account_storage(
74977497
slot,
74987498
|loaded_account: &LoadedAccount| {
74997499
// Cache only has one version per key, don't need to worry about versioning
75007500
Some((*loaded_account.pubkey(), loaded_account.loaded_hash()))
75017501
},
7502-
|accum: &DashMap<Pubkey, AccountHash>, loaded_account: &LoadedAccount, _data| {
7502+
|accum: &mut HashMap<Pubkey, AccountHash>,
7503+
loaded_account: &LoadedAccount,
7504+
_data| {
75037505
let mut loaded_hash = loaded_account.loaded_hash();
75047506
if loaded_hash == AccountHash(Hash::default()) {
75057507
loaded_hash = Self::hash_account(loaded_account, loaded_account.pubkey())
@@ -7527,7 +7529,7 @@ impl AccountsDb {
75277529
// Cache only has one version per key, don't need to worry about versioning
75287530
Some((*loaded_account.pubkey(), loaded_account.take_account()))
75297531
},
7530-
|accum: &DashMap<_, _>, loaded_account, _data| {
7532+
|accum: &mut HashMap<_, _>, loaded_account, _data| {
75317533
// Storage may have duplicates so only keep the latest version for each key
75327534
accum.insert(*loaded_account.pubkey(), loaded_account.take_account());
75337535
},
@@ -7543,7 +7545,7 @@ impl AccountsDb {
75437545
/// Return all of the accounts for a given slot
75447546
pub fn get_pubkey_hash_account_for_slot(&self, slot: Slot) -> Vec<PubkeyHashAccount> {
75457547
type ScanResult =
7546-
ScanStorageResult<PubkeyHashAccount, DashMap<Pubkey, (AccountHash, AccountSharedData)>>;
7548+
ScanStorageResult<PubkeyHashAccount, HashMap<Pubkey, (AccountHash, AccountSharedData)>>;
75477549
let scan_result: ScanResult = self.scan_account_storage(
75487550
slot,
75497551
|loaded_account: &LoadedAccount| {
@@ -7554,7 +7556,7 @@ impl AccountsDb {
75547556
account: loaded_account.take_account(),
75557557
})
75567558
},
7557-
|accum: &DashMap<Pubkey, (AccountHash, AccountSharedData)>,
7559+
|accum: &mut HashMap<Pubkey, (AccountHash, AccountSharedData)>,
75587560
loaded_account: &LoadedAccount,
75597561
_data| {
75607562
// Storage may have duplicates so only keep the latest version for each key

accounts-db/src/accounts_db/tests.rs

+13-16
Original file line numberDiff line numberDiff line change
@@ -4418,7 +4418,7 @@ fn test_accounts_db_cache_clean_dead_slots() {
44184418
if let ScanStorageResult::Stored(slot_accounts) = accounts_db.scan_account_storage(
44194419
*slot as Slot,
44204420
|_| Some(0),
4421-
|slot_accounts: &DashSet<Pubkey>, loaded_account: &LoadedAccount, _data| {
4421+
|slot_accounts: &mut HashSet<Pubkey>, loaded_account: &LoadedAccount, _data| {
44224422
slot_accounts.insert(*loaded_account.pubkey());
44234423
},
44244424
ScanAccountStorageData::NoData,
@@ -4452,12 +4452,12 @@ fn test_accounts_db_cache_clean() {
44524452
if let ScanStorageResult::Stored(slot_account) = accounts_db.scan_account_storage(
44534453
*slot as Slot,
44544454
|_| Some(0),
4455-
|slot_account: &RwLock<Pubkey>, loaded_account: &LoadedAccount, _data| {
4456-
*slot_account.write().unwrap() = *loaded_account.pubkey();
4455+
|slot_account: &mut Pubkey, loaded_account: &LoadedAccount, _data| {
4456+
*slot_account = *loaded_account.pubkey();
44574457
},
44584458
ScanAccountStorageData::NoData,
44594459
) {
4460-
assert_eq!(*slot_account.read().unwrap(), keys[*slot as usize]);
4460+
assert_eq!(slot_account, keys[*slot as usize]);
44614461
} else {
44624462
panic!("Everything should have been flushed")
44634463
}
@@ -4517,7 +4517,7 @@ fn run_test_accounts_db_cache_clean_max_root(
45174517
assert!(*slot > requested_flush_root);
45184518
Some(*loaded_account.pubkey())
45194519
},
4520-
|slot_accounts: &DashSet<Pubkey>, loaded_account: &LoadedAccount, _data| {
4520+
|slot_accounts: &mut HashSet<Pubkey>, loaded_account: &LoadedAccount, _data| {
45214521
slot_accounts.insert(*loaded_account.pubkey());
45224522
if !is_cache_at_limit {
45234523
// Only true when the limit hasn't been reached and there are still
@@ -4625,17 +4625,14 @@ fn run_flush_rooted_accounts_cache(should_clean: bool) {
46254625
// If no cleaning is specified, then flush everything
46264626
accounts_db.flush_rooted_accounts_cache(None, should_clean);
46274627
for slot in &slots {
4628-
let slot_accounts = if let ScanStorageResult::Stored(slot_accounts) = accounts_db
4629-
.scan_account_storage(
4630-
*slot as Slot,
4631-
|_| Some(0),
4632-
|slot_account: &DashSet<Pubkey>, loaded_account: &LoadedAccount, _data| {
4633-
slot_account.insert(*loaded_account.pubkey());
4634-
},
4635-
ScanAccountStorageData::NoData,
4636-
) {
4637-
slot_accounts.into_iter().collect::<HashSet<Pubkey>>()
4638-
} else {
4628+
let ScanStorageResult::Stored(slot_accounts) = accounts_db.scan_account_storage(
4629+
*slot as Slot,
4630+
|_| Some(0),
4631+
|slot_account: &mut HashSet<Pubkey>, loaded_account: &LoadedAccount, _data| {
4632+
slot_account.insert(*loaded_account.pubkey());
4633+
},
4634+
ScanAccountStorageData::NoData,
4635+
) else {
46394636
panic!("All roots should have been flushed to storage");
46404637
};
46414638
let expected_accounts = if !should_clean || slot == slots.last().unwrap() {

0 commit comments

Comments
 (0)