minor refactoring of AccountsIndex in preparation of bigger things (#17237)
This commit is contained in:
parent
fd88db7339
commit
3745e0babc
|
@ -492,9 +492,12 @@ pub trait ZeroLamport {
|
||||||
fn is_zero_lamport(&self) -> bool;
|
fn is_zero_lamport(&self) -> bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MapType<T> = AccountMap<Pubkey, AccountMapEntry<T>>;
|
||||||
|
type ReadWriteLockMapType<'a, T> = RwLockWriteGuard<'a, AccountMap<Pubkey, AccountMapEntry<T>>>;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct AccountsIndex<T> {
|
pub struct AccountsIndex<T> {
|
||||||
pub account_maps: RwLock<AccountMap<Pubkey, AccountMapEntry<T>>>,
|
pub account_maps: RwLock<MapType<T>>,
|
||||||
program_id_index: SecondaryIndex<DashMapSecondaryIndexEntry>,
|
program_id_index: SecondaryIndex<DashMapSecondaryIndexEntry>,
|
||||||
spl_token_mint_index: SecondaryIndex<DashMapSecondaryIndexEntry>,
|
spl_token_mint_index: SecondaryIndex<DashMapSecondaryIndexEntry>,
|
||||||
spl_token_owner_index: SecondaryIndex<RwLockSecondaryIndexEntry>,
|
spl_token_owner_index: SecondaryIndex<RwLockSecondaryIndexEntry>,
|
||||||
|
@ -836,12 +839,16 @@ impl<T: 'static + Clone + IsCached + ZeroLamport> AccountsIndex<T> {
|
||||||
.map(WriteAccountMapEntry::from_account_map_entry)
|
.map(WriteAccountMapEntry::from_account_map_entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn insert_new_entry_if_missing(&self, pubkey: &Pubkey) -> (WriteAccountMapEntry<T>, bool) {
|
fn new_entry() -> AccountMapEntry<T> {
|
||||||
let new_entry = Arc::new(AccountMapEntryInner {
|
Arc::new(AccountMapEntryInner {
|
||||||
ref_count: AtomicU64::new(0),
|
ref_count: AtomicU64::new(0),
|
||||||
slot_list: RwLock::new(SlotList::with_capacity(1)),
|
slot_list: RwLock::new(SlotList::with_capacity(1)),
|
||||||
});
|
})
|
||||||
let mut w_account_maps = self.account_maps.write().unwrap();
|
}
|
||||||
|
|
||||||
|
fn insert_new_entry_if_missing(&self, pubkey: &Pubkey) -> (WriteAccountMapEntry<T>, bool) {
|
||||||
|
let new_entry = Self::new_entry();
|
||||||
|
let mut w_account_maps = self.get_account_maps_write_lock();
|
||||||
let mut is_newly_inserted = false;
|
let mut is_newly_inserted = false;
|
||||||
let account_entry = w_account_maps.entry(*pubkey).or_insert_with(|| {
|
let account_entry = w_account_maps.entry(*pubkey).or_insert_with(|| {
|
||||||
is_newly_inserted = true;
|
is_newly_inserted = true;
|
||||||
|
@ -873,7 +880,7 @@ impl<T: 'static + Clone + IsCached + ZeroLamport> AccountsIndex<T> {
|
||||||
) {
|
) {
|
||||||
if !dead_keys.is_empty() {
|
if !dead_keys.is_empty() {
|
||||||
for key in dead_keys.iter() {
|
for key in dead_keys.iter() {
|
||||||
let mut w_index = self.account_maps.write().unwrap();
|
let mut w_index = self.get_account_maps_write_lock();
|
||||||
if let btree_map::Entry::Occupied(index_entry) = w_index.entry(**key) {
|
if let btree_map::Entry::Occupied(index_entry) = w_index.entry(**key) {
|
||||||
if index_entry.get().slot_list.read().unwrap().is_empty() {
|
if index_entry.get().slot_list.read().unwrap().is_empty() {
|
||||||
index_entry.remove();
|
index_entry.remove();
|
||||||
|
@ -1140,6 +1147,10 @@ impl<T: 'static + Clone + IsCached + ZeroLamport> AccountsIndex<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_account_maps_write_lock(&self) -> ReadWriteLockMapType<T> {
|
||||||
|
self.account_maps.write().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
// Same functionally to upsert, but doesn't take the read lock
|
// Same functionally to upsert, but doesn't take the read lock
|
||||||
// initially on the accounts_map
|
// initially on the accounts_map
|
||||||
// Can save time when inserting lots of new keys
|
// Can save time when inserting lots of new keys
|
||||||
|
@ -1283,7 +1294,7 @@ impl<T: 'static + Clone + IsCached + ZeroLamport> AccountsIndex<T> {
|
||||||
// locked and inserted the pubkey inbetween when `is_slot_list_empty=true` and the call to
|
// locked and inserted the pubkey inbetween when `is_slot_list_empty=true` and the call to
|
||||||
// remove() below.
|
// remove() below.
|
||||||
if is_slot_list_empty {
|
if is_slot_list_empty {
|
||||||
let mut w_maps = self.account_maps.write().unwrap();
|
let mut w_maps = self.get_account_maps_write_lock();
|
||||||
if let Some(x) = w_maps.get(pubkey) {
|
if let Some(x) = w_maps.get(pubkey) {
|
||||||
if x.slot_list.read().unwrap().is_empty() {
|
if x.slot_list.read().unwrap().is_empty() {
|
||||||
w_maps.remove(pubkey);
|
w_maps.remove(pubkey);
|
||||||
|
|
Loading…
Reference in New Issue