load_accounts_index_for_shrink ignores cached entries (#21951)
This commit is contained in:
parent
6ff0be6a82
commit
e11a1911ad
|
@ -102,6 +102,9 @@ impl IsCached for StorageLocation {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// We have to have SOME value for store_id when we are cached
|
||||||
|
const CACHE_VIRTUAL_STORAGE_ID: AppendVecId = AppendVecId::MAX;
|
||||||
|
|
||||||
impl AccountInfo {
|
impl AccountInfo {
|
||||||
pub fn new(storage_location: StorageLocation, stored_size: StoredSize, lamports: u64) -> Self {
|
pub fn new(storage_location: StorageLocation, stored_size: StoredSize, lamports: u64) -> Self {
|
||||||
assert_eq!(stored_size & ALL_FLAGS, 0);
|
assert_eq!(stored_size & ALL_FLAGS, 0);
|
||||||
|
@ -110,8 +113,6 @@ impl AccountInfo {
|
||||||
StorageLocation::AppendVec(store_id, offset) => (store_id, offset),
|
StorageLocation::AppendVec(store_id, offset) => (store_id, offset),
|
||||||
StorageLocation::Cached => {
|
StorageLocation::Cached => {
|
||||||
stored_size_mask |= IS_CACHED_STORE_ID_FLAG;
|
stored_size_mask |= IS_CACHED_STORE_ID_FLAG;
|
||||||
// We have to have SOME value for store_id when we are cached
|
|
||||||
const CACHE_VIRTUAL_STORAGE_ID: AppendVecId = AppendVecId::MAX;
|
|
||||||
(CACHE_VIRTUAL_STORAGE_ID, CACHE_VIRTUAL_OFFSET)
|
(CACHE_VIRTUAL_STORAGE_ID, CACHE_VIRTUAL_OFFSET)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -141,6 +142,13 @@ impl AccountInfo {
|
||||||
self.stored_size_mask & !ALL_FLAGS
|
self.stored_size_mask & !ALL_FLAGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// true iff store_id and offset match self AND self is not cached
|
||||||
|
/// If self is cached, then store_id and offset are meaningless.
|
||||||
|
pub fn matches_storage_location(&self, store_id: AppendVecId, offset: Offset) -> bool {
|
||||||
|
// order is set for best short circuit
|
||||||
|
self.store_id == store_id && self.offset() == offset && !self.is_cached()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn storage_location(&self) -> StorageLocation {
|
pub fn storage_location(&self) -> StorageLocation {
|
||||||
if self.is_cached() {
|
if self.is_cached() {
|
||||||
StorageLocation::Cached
|
StorageLocation::Cached
|
||||||
|
@ -172,4 +180,26 @@ mod test {
|
||||||
let offset = 1; // not aligned
|
let offset = 1; // not aligned
|
||||||
AccountInfo::new(StorageLocation::AppendVec(0, offset), 0, 0);
|
AccountInfo::new(StorageLocation::AppendVec(0, offset), 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_matches_storage_location() {
|
||||||
|
let offset = 0;
|
||||||
|
let id = 0;
|
||||||
|
let info = AccountInfo::new(StorageLocation::AppendVec(id, offset), 0, 0);
|
||||||
|
assert!(info.matches_storage_location(id, offset));
|
||||||
|
|
||||||
|
// wrong offset
|
||||||
|
let offset = ALIGN_BOUNDARY_OFFSET;
|
||||||
|
assert!(!info.matches_storage_location(id, offset));
|
||||||
|
|
||||||
|
// wrong id
|
||||||
|
let offset = 0;
|
||||||
|
let id = 1;
|
||||||
|
assert!(!info.matches_storage_location(id, offset));
|
||||||
|
|
||||||
|
// is cached
|
||||||
|
let id = CACHE_VIRTUAL_STORAGE_ID;
|
||||||
|
let info = AccountInfo::new(StorageLocation::Cached, 0, 0);
|
||||||
|
assert!(!info.matches_storage_location(id, offset));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2576,9 +2576,11 @@ impl AccountsDb {
|
||||||
iter.for_each(|(pubkey, stored_account)| {
|
iter.for_each(|(pubkey, stored_account)| {
|
||||||
let lookup = self.accounts_index.get_account_read_entry(pubkey);
|
let lookup = self.accounts_index.get_account_read_entry(pubkey);
|
||||||
if let Some(locked_entry) = lookup {
|
if let Some(locked_entry) = lookup {
|
||||||
let is_alive = locked_entry.slot_list().iter().any(|(_slot, i)| {
|
let is_alive = locked_entry.slot_list().iter().any(|(_slot, acct_info)| {
|
||||||
i.store_id() == stored_account.store_id
|
acct_info.matches_storage_location(
|
||||||
&& i.offset() == stored_account.account.offset
|
stored_account.store_id,
|
||||||
|
stored_account.account.offset,
|
||||||
|
)
|
||||||
});
|
});
|
||||||
if !is_alive {
|
if !is_alive {
|
||||||
// This pubkey was found in the storage, but no longer exists in the index.
|
// This pubkey was found in the storage, but no longer exists in the index.
|
||||||
|
|
Loading…
Reference in New Issue