AcctIdx: consolidate lock_and_update_slot_list (#20090)
This commit is contained in:
committed by
GitHub
parent
4fb77183ef
commit
0eb0d7f73b
@ -283,22 +283,6 @@ impl<T: IndexValue> WriteAccountMapEntry<T> {
|
|||||||
AccountMapEntryMeta::new_dirty(storage),
|
AccountMapEntryMeta::new_dirty(storage),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to update an item in the slot list the given `slot` If an item for the slot
|
|
||||||
// already exists in the list, remove the older item, add it to `reclaims`, and insert
|
|
||||||
// the new item.
|
|
||||||
pub fn update(&mut self, slot: Slot, account_info: T, reclaims: &mut SlotList<T>) {
|
|
||||||
let mut addref = !account_info.is_cached();
|
|
||||||
self.slot_list_mut(|list| {
|
|
||||||
addref =
|
|
||||||
InMemAccountsIndex::update_slot_list(list, slot, account_info, reclaims, false);
|
|
||||||
});
|
|
||||||
if addref {
|
|
||||||
// If it's the first non-cache insert, also bump the stored ref count
|
|
||||||
self.borrow_owned_entry().add_un_ref(true);
|
|
||||||
}
|
|
||||||
self.borrow_owned_entry().set_dirty(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, AbiExample, Clone)]
|
#[derive(Debug, Default, AbiExample, Clone)]
|
||||||
@ -1578,9 +1562,15 @@ impl<T: IndexValue> AccountsIndex<T> {
|
|||||||
items.into_iter().for_each(|(pubkey, new_item)| {
|
items.into_iter().for_each(|(pubkey, new_item)| {
|
||||||
let already_exists =
|
let already_exists =
|
||||||
w_account_maps.insert_new_entry_if_missing_with_lock(pubkey, new_item);
|
w_account_maps.insert_new_entry_if_missing_with_lock(pubkey, new_item);
|
||||||
if let Some((mut w_account_entry, account_info, pubkey)) = already_exists {
|
if let Some((account_entry, account_info, pubkey)) = already_exists {
|
||||||
let is_zero_lamport = account_info.is_zero_lamport();
|
let is_zero_lamport = account_info.is_zero_lamport();
|
||||||
w_account_entry.update(slot, account_info, &mut _reclaims);
|
InMemAccountsIndex::lock_and_update_slot_list(
|
||||||
|
&account_entry,
|
||||||
|
(slot, account_info),
|
||||||
|
&mut _reclaims,
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
|
||||||
if !is_zero_lamport {
|
if !is_zero_lamport {
|
||||||
// zero lamports were already added to dirty_pubkeys above
|
// zero lamports were already added to dirty_pubkeys above
|
||||||
dirty_pubkeys.push(pubkey);
|
dirty_pubkeys.push(pubkey);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use crate::accounts_index::{
|
use crate::accounts_index::{
|
||||||
AccountMapEntry, AccountMapEntryInner, AccountMapEntryMeta, IndexValue, RefCount, SlotList,
|
AccountMapEntry, AccountMapEntryInner, AccountMapEntryMeta, IndexValue, RefCount, SlotList,
|
||||||
SlotSlice, WriteAccountMapEntry,
|
SlotSlice,
|
||||||
};
|
};
|
||||||
use crate::bucket_map_holder::{Age, BucketMapHolder};
|
use crate::bucket_map_holder::{Age, BucketMapHolder};
|
||||||
use crate::bucket_map_holder_stats::BucketMapHolderStats;
|
use crate::bucket_map_holder_stats::BucketMapHolderStats;
|
||||||
@ -239,7 +239,7 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
let current = occupied.get_mut();
|
let current = occupied.get_mut();
|
||||||
Self::lock_and_update_slot_list(
|
Self::lock_and_update_slot_list(
|
||||||
current,
|
current,
|
||||||
&new_value,
|
new_value.slot_list.write().unwrap().remove(0),
|
||||||
reclaims,
|
reclaims,
|
||||||
previous_slot_entry_was_cached,
|
previous_slot_entry_was_cached,
|
||||||
);
|
);
|
||||||
@ -252,7 +252,7 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
// on disk, so merge new_value with what was on disk
|
// on disk, so merge new_value with what was on disk
|
||||||
Self::lock_and_update_slot_list(
|
Self::lock_and_update_slot_list(
|
||||||
&disk_entry,
|
&disk_entry,
|
||||||
&new_value,
|
new_value.slot_list.write().unwrap().remove(0),
|
||||||
reclaims,
|
reclaims,
|
||||||
previous_slot_entry_was_cached,
|
previous_slot_entry_was_cached,
|
||||||
);
|
);
|
||||||
@ -268,14 +268,17 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Try to update an item in the slot list the given `slot` If an item for the slot
|
||||||
|
// already exists in the list, remove the older item, add it to `reclaims`, and insert
|
||||||
|
// the new item.
|
||||||
pub fn lock_and_update_slot_list(
|
pub fn lock_and_update_slot_list(
|
||||||
current: &Arc<AccountMapEntryInner<T>>,
|
current: &AccountMapEntryInner<T>,
|
||||||
new_value: &AccountMapEntry<T>,
|
new_value: (Slot, T),
|
||||||
reclaims: &mut SlotList<T>,
|
reclaims: &mut SlotList<T>,
|
||||||
previous_slot_entry_was_cached: bool,
|
previous_slot_entry_was_cached: bool,
|
||||||
) {
|
) {
|
||||||
let mut slot_list = current.slot_list.write().unwrap();
|
let mut slot_list = current.slot_list.write().unwrap();
|
||||||
let (slot, new_entry) = new_value.slot_list.write().unwrap().remove(0);
|
let (slot, new_entry) = new_value;
|
||||||
let addref = Self::update_slot_list(
|
let addref = Self::update_slot_list(
|
||||||
&mut slot_list,
|
&mut slot_list,
|
||||||
slot,
|
slot,
|
||||||
@ -291,7 +294,7 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
|
|
||||||
// modifies slot_list
|
// modifies slot_list
|
||||||
// returns true if caller should addref
|
// returns true if caller should addref
|
||||||
pub fn update_slot_list(
|
fn update_slot_list(
|
||||||
list: &mut SlotList<T>,
|
list: &mut SlotList<T>,
|
||||||
slot: Slot,
|
slot: Slot,
|
||||||
account_info: T,
|
account_info: T,
|
||||||
@ -351,7 +354,7 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
if let Some(current) = self.map().read().unwrap().get(pubkey) {
|
if let Some(current) = self.map().read().unwrap().get(pubkey) {
|
||||||
Self::lock_and_update_slot_list(
|
Self::lock_and_update_slot_list(
|
||||||
current,
|
current,
|
||||||
new_value,
|
new_value.slot_list.write().unwrap().remove(0),
|
||||||
reclaims,
|
reclaims,
|
||||||
previous_slot_entry_was_cached,
|
previous_slot_entry_was_cached,
|
||||||
);
|
);
|
||||||
@ -373,9 +376,9 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
existing: &AccountMapEntry<T>,
|
existing: &AccountMapEntry<T>,
|
||||||
pubkey: &Pubkey,
|
pubkey: &Pubkey,
|
||||||
new_entry: AccountMapEntry<T>,
|
new_entry: AccountMapEntry<T>,
|
||||||
) -> (WriteAccountMapEntry<T>, T, Pubkey) {
|
) -> (AccountMapEntry<T>, T, Pubkey) {
|
||||||
(
|
(
|
||||||
WriteAccountMapEntry::from_account_map_entry(Arc::clone(existing)),
|
Arc::clone(existing),
|
||||||
// extract the new account_info from the unused 'new_entry'
|
// extract the new account_info from the unused 'new_entry'
|
||||||
new_entry.slot_list.write().unwrap().remove(0).1,
|
new_entry.slot_list.write().unwrap().remove(0).1,
|
||||||
*pubkey,
|
*pubkey,
|
||||||
@ -388,7 +391,7 @@ impl<T: IndexValue> InMemAccountsIndex<T> {
|
|||||||
&self,
|
&self,
|
||||||
pubkey: Pubkey,
|
pubkey: Pubkey,
|
||||||
new_entry: AccountMapEntry<T>,
|
new_entry: AccountMapEntry<T>,
|
||||||
) -> Option<(WriteAccountMapEntry<T>, T, Pubkey)> {
|
) -> Option<(AccountMapEntry<T>, T, Pubkey)> {
|
||||||
let m = Measure::start("entry");
|
let m = Measure::start("entry");
|
||||||
let mut map = self.map().write().unwrap();
|
let mut map = self.map().write().unwrap();
|
||||||
let entry = map.entry(pubkey);
|
let entry = map.entry(pubkey);
|
||||||
|
Reference in New Issue
Block a user