add <T> through accounts index (#19852)

This commit is contained in:
Jeff Washington (jwash) 2021-09-13 22:59:03 -05:00 committed by GitHub
parent 4fdd70c931
commit 910f241c3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 17 deletions

View File

@ -48,7 +48,9 @@ pub type AccountMap<V> = InMemAccountsIndex<V>;
pub(crate) type AccountMapEntry<T> = Arc<AccountMapEntryInner<T>>; pub(crate) type AccountMapEntry<T> = Arc<AccountMapEntryInner<T>>;
pub trait IsCached: 'static + Clone + Debug + PartialEq + ZeroLamport + Copy + Default { pub trait IsCached:
'static + Clone + Debug + PartialEq + ZeroLamport + Copy + Default + Sync + Send
{
fn is_cached(&self) -> bool; fn is_cached(&self) -> bool;
} }
@ -694,7 +696,7 @@ pub struct AccountsIndex<T: IsCached> {
// scanning the fork with that Bank at the tip is no longer possible. // scanning the fork with that Bank at the tip is no longer possible.
pub removed_bank_ids: Mutex<HashSet<BankId>>, pub removed_bank_ids: Mutex<HashSet<BankId>>,
storage: AccountsIndexStorage, storage: AccountsIndexStorage<T>,
} }
impl<T: IsCached> AccountsIndex<T> { impl<T: IsCached> AccountsIndex<T> {
@ -725,7 +727,11 @@ impl<T: IsCached> AccountsIndex<T> {
fn allocate_accounts_index( fn allocate_accounts_index(
config: Option<AccountsIndexConfig>, config: Option<AccountsIndexConfig>,
) -> (LockMapType<T>, PubkeyBinCalculator16, AccountsIndexStorage) { ) -> (
LockMapType<T>,
PubkeyBinCalculator16,
AccountsIndexStorage<T>,
) {
let bins = config let bins = config
.and_then(|config| config.bins) .and_then(|config| config.bins)
.unwrap_or(BINS_DEFAULT); .unwrap_or(BINS_DEFAULT);

View File

@ -1,3 +1,4 @@
use crate::accounts_index::IsCached;
use crate::bucket_map_holder::BucketMapHolder; use crate::bucket_map_holder::BucketMapHolder;
use crate::waitable_condvar::WaitableCondvar; use crate::waitable_condvar::WaitableCondvar;
use std::{ use std::{
@ -14,17 +15,17 @@ use std::{
// and it will stop all the background threads and join them. // and it will stop all the background threads and join them.
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct AccountsIndexStorage { pub struct AccountsIndexStorage<T: IsCached> {
// for managing the bg threads // for managing the bg threads
exit: Arc<AtomicBool>, exit: Arc<AtomicBool>,
wait: Arc<WaitableCondvar>, wait: Arc<WaitableCondvar>,
handle: Option<JoinHandle<()>>, handle: Option<JoinHandle<()>>,
// eventually the backing storage // eventually the backing storage
storage: Arc<BucketMapHolder>, storage: Arc<BucketMapHolder<T>>,
} }
impl Drop for AccountsIndexStorage { impl<T: IsCached> Drop for AccountsIndexStorage<T> {
fn drop(&mut self) { fn drop(&mut self) {
self.exit.store(true, Ordering::Relaxed); self.exit.store(true, Ordering::Relaxed);
self.wait.notify_all(); self.wait.notify_all();
@ -34,8 +35,8 @@ impl Drop for AccountsIndexStorage {
} }
} }
impl AccountsIndexStorage { impl<T: IsCached> AccountsIndexStorage<T> {
pub fn new() -> AccountsIndexStorage { pub fn new() -> AccountsIndexStorage<T> {
let storage = Arc::new(BucketMapHolder::new()); let storage = Arc::new(BucketMapHolder::new());
let storage_ = storage.clone(); let storage_ = storage.clone();
let exit = Arc::new(AtomicBool::default()); let exit = Arc::new(AtomicBool::default());
@ -59,7 +60,7 @@ impl AccountsIndexStorage {
} }
} }
pub fn storage(&self) -> &Arc<BucketMapHolder> { pub fn storage(&self) -> &Arc<BucketMapHolder<T>> {
&self.storage &self.storage
} }
} }

View File

@ -1,3 +1,4 @@
use crate::accounts_index::IsCached;
use crate::bucket_map_holder_stats::BucketMapHolderStats; use crate::bucket_map_holder_stats::BucketMapHolderStats;
use crate::waitable_condvar::WaitableCondvar; use crate::waitable_condvar::WaitableCondvar;
use std::fmt::Debug; use std::fmt::Debug;
@ -7,15 +8,14 @@ use std::time::Duration;
// will eventually hold the bucket map // will eventually hold the bucket map
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct BucketMapHolder { pub struct BucketMapHolder<T: IsCached> {
pub stats: BucketMapHolderStats, pub stats: BucketMapHolderStats,
_phantom: std::marker::PhantomData<T>,
} }
impl BucketMapHolder { impl<T: IsCached> BucketMapHolder<T> {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self::default()
stats: BucketMapHolderStats::default(),
}
} }
// intended to execute in a bg thread // intended to execute in a bg thread

View File

@ -22,12 +22,12 @@ type K = Pubkey;
pub struct InMemAccountsIndex<T: IsCached> { pub struct InMemAccountsIndex<T: IsCached> {
// backing store // backing store
map: HashMap<Pubkey, AccountMapEntry<T>>, map: HashMap<Pubkey, AccountMapEntry<T>>,
storage: Arc<BucketMapHolder>, storage: Arc<BucketMapHolder<T>>,
bin: usize, bin: usize,
} }
impl<T: IsCached> InMemAccountsIndex<T> { impl<T: IsCached> InMemAccountsIndex<T> {
pub fn new(storage: &AccountsIndexStorage, bin: usize) -> Self { pub fn new(storage: &AccountsIndexStorage<T>, bin: usize) -> Self {
Self { Self {
map: HashMap::new(), map: HashMap::new(),
storage: storage.storage().clone(), storage: storage.storage().clone(),
@ -35,7 +35,7 @@ impl<T: IsCached> InMemAccountsIndex<T> {
} }
} }
pub fn new_bucket_map_holder() -> Arc<BucketMapHolder> { pub fn new_bucket_map_holder() -> Arc<BucketMapHolder<T>> {
Arc::new(BucketMapHolder::new()) Arc::new(BucketMapHolder::new())
} }