some basic accounts index refactoring (#19510)
This commit is contained in:
committed by
GitHub
parent
6cfd44b811
commit
a655b01700
@ -30,17 +30,19 @@ use thiserror::Error;
|
|||||||
|
|
||||||
pub const ITER_BATCH_SIZE: usize = 1000;
|
pub const ITER_BATCH_SIZE: usize = 1000;
|
||||||
pub const BINS_DEFAULT: usize = 8192;
|
pub const BINS_DEFAULT: usize = 8192;
|
||||||
|
pub const BINS_FOR_TESTING: usize = BINS_DEFAULT;
|
||||||
|
pub const BINS_FOR_BENCHMARKS: usize = BINS_DEFAULT;
|
||||||
pub const ACCOUNTS_INDEX_CONFIG_FOR_TESTING: AccountsIndexConfig = AccountsIndexConfig {
|
pub const ACCOUNTS_INDEX_CONFIG_FOR_TESTING: AccountsIndexConfig = AccountsIndexConfig {
|
||||||
bins: Some(BINS_DEFAULT),
|
bins: Some(BINS_FOR_TESTING),
|
||||||
};
|
};
|
||||||
pub const ACCOUNTS_INDEX_CONFIG_FOR_BENCHMARKS: AccountsIndexConfig = AccountsIndexConfig {
|
pub const ACCOUNTS_INDEX_CONFIG_FOR_BENCHMARKS: AccountsIndexConfig = AccountsIndexConfig {
|
||||||
bins: Some(BINS_DEFAULT),
|
bins: Some(BINS_FOR_BENCHMARKS),
|
||||||
};
|
};
|
||||||
pub type ScanResult<T> = Result<T, ScanError>;
|
pub type ScanResult<T> = Result<T, ScanError>;
|
||||||
pub type SlotList<T> = Vec<(Slot, T)>;
|
pub type SlotList<T> = Vec<(Slot, T)>;
|
||||||
pub type SlotSlice<'s, T> = &'s [(Slot, T)];
|
pub type SlotSlice<'s, T> = &'s [(Slot, T)];
|
||||||
pub type RefCount = u64;
|
pub type RefCount = u64;
|
||||||
pub type AccountMap<K, V> = HashMap<K, V>;
|
pub type AccountMap<V> = HashMap<Pubkey, V>;
|
||||||
|
|
||||||
type AccountMapEntry<T> = Arc<AccountMapEntryInner<T>>;
|
type AccountMapEntry<T> = Arc<AccountMapEntryInner<T>>;
|
||||||
|
|
||||||
@ -117,21 +119,21 @@ impl<T> AccountMapEntryInner<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum AccountIndexGetResult<'a, T: 'static> {
|
pub enum AccountIndexGetResult<'a, T: IsCached> {
|
||||||
Found(ReadAccountMapEntry<T>, usize),
|
Found(ReadAccountMapEntry<T>, usize),
|
||||||
NotFoundOnFork,
|
NotFoundOnFork,
|
||||||
Missing(AccountMapsReadLock<'a, T>),
|
Missing(AccountMapsReadLock<'a, T>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[self_referencing]
|
#[self_referencing]
|
||||||
pub struct ReadAccountMapEntry<T: 'static> {
|
pub struct ReadAccountMapEntry<T: IsCached> {
|
||||||
owned_entry: AccountMapEntry<T>,
|
owned_entry: AccountMapEntry<T>,
|
||||||
#[borrows(owned_entry)]
|
#[borrows(owned_entry)]
|
||||||
#[covariant]
|
#[covariant]
|
||||||
slot_list_guard: RwLockReadGuard<'this, SlotList<T>>,
|
slot_list_guard: RwLockReadGuard<'this, SlotList<T>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Clone> ReadAccountMapEntry<T> {
|
impl<T: IsCached> ReadAccountMapEntry<T> {
|
||||||
pub fn from_account_map_entry(account_map_entry: AccountMapEntry<T>) -> Self {
|
pub fn from_account_map_entry(account_map_entry: AccountMapEntry<T>) -> Self {
|
||||||
ReadAccountMapEntryBuilder {
|
ReadAccountMapEntryBuilder {
|
||||||
owned_entry: account_map_entry,
|
owned_entry: account_map_entry,
|
||||||
@ -162,7 +164,7 @@ impl<T: Clone> ReadAccountMapEntry<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[self_referencing]
|
#[self_referencing]
|
||||||
pub struct WriteAccountMapEntry<T: 'static> {
|
pub struct WriteAccountMapEntry<T: IsCached> {
|
||||||
owned_entry: AccountMapEntry<T>,
|
owned_entry: AccountMapEntry<T>,
|
||||||
#[borrows(owned_entry)]
|
#[borrows(owned_entry)]
|
||||||
#[covariant]
|
#[covariant]
|
||||||
@ -709,7 +711,7 @@ impl<'a, T> AccountsIndexIterator<'a, T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T: 'static + Clone> Iterator for AccountsIndexIterator<'a, T> {
|
impl<'a, T: IsCached> Iterator for AccountsIndexIterator<'a, T> {
|
||||||
type Item = Vec<(Pubkey, AccountMapEntry<T>)>;
|
type Item = Vec<(Pubkey, AccountMapEntry<T>)>;
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
if self.is_finished {
|
if self.is_finished {
|
||||||
@ -747,7 +749,7 @@ pub trait ZeroLamport {
|
|||||||
fn is_zero_lamport(&self) -> bool;
|
fn is_zero_lamport(&self) -> bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
type MapType<T> = AccountMap<Pubkey, AccountMapEntry<T>>;
|
type MapType<T> = AccountMap<AccountMapEntry<T>>;
|
||||||
type LockMapType<T> = Vec<RwLock<MapType<T>>>;
|
type LockMapType<T> = Vec<RwLock<MapType<T>>>;
|
||||||
type LockMapTypeSlice<T> = [RwLock<MapType<T>>];
|
type LockMapTypeSlice<T> = [RwLock<MapType<T>>];
|
||||||
type AccountMapsWriteLock<'a, T> = RwLockWriteGuard<'a, MapType<T>>;
|
type AccountMapsWriteLock<'a, T> = RwLockWriteGuard<'a, MapType<T>>;
|
||||||
@ -1953,7 +1955,7 @@ pub mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T: 'static> AccountIndexGetResult<'a, T> {
|
impl<'a, T: IsCached> AccountIndexGetResult<'a, T> {
|
||||||
pub fn unwrap(self) -> (ReadAccountMapEntry<T>, usize) {
|
pub fn unwrap(self) -> (ReadAccountMapEntry<T>, usize) {
|
||||||
match self {
|
match self {
|
||||||
AccountIndexGetResult::Found(lock, size) => (lock, size),
|
AccountIndexGetResult::Found(lock, size) => (lock, size),
|
||||||
|
Reference in New Issue
Block a user