Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 338e4be

Browse files
committed
Change API to check owners, instead of returning account meta
1 parent d7dfb8b commit 338e4be

File tree

2 files changed

+88
-85
lines changed

2 files changed

+88
-85
lines changed

runtime/src/accounts_db.rs

Lines changed: 64 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ use {
4242
get_ancient_append_vec_capacity, is_ancient, AccountsToStore, StorageSelector,
4343
},
4444
append_vec::{
45-
aligned_stored_size, AccountMeta, AppendVec,
46-
StorableAccountsWithHashesAndWriteVersions, StoredAccountMeta, StoredMetaWriteVersion,
47-
APPEND_VEC_MMAPPED_FILES_OPEN, STORE_META_OVERHEAD,
45+
aligned_stored_size, AppendVec, StorableAccountsWithHashesAndWriteVersions,
46+
StoredAccountMeta, StoredMetaWriteVersion, APPEND_VEC_MMAPPED_FILES_OPEN,
47+
STORE_META_OVERHEAD,
4848
},
4949
cache_hash_data::{CacheHashData, CacheHashDataFile},
5050
contains::Contains,
@@ -810,24 +810,21 @@ impl<'a> LoadedAccountAccessor<'a> {
810810
}
811811
}
812812

813-
fn get_account_meta(&self) -> Option<AccountMeta> {
813+
fn account_matches_owners(&self, owners: &[&Pubkey]) -> Option<bool> {
814814
match self {
815-
LoadedAccountAccessor::Cached(cached_account) => {
816-
cached_account.as_ref().map(|cached_account| AccountMeta {
817-
lamports: cached_account.account.lamports(),
818-
rent_epoch: cached_account.account.rent_epoch(),
819-
owner: *cached_account.account.owner(),
820-
executable: cached_account.account.executable(),
821-
})
822-
}
815+
LoadedAccountAccessor::Cached(cached_account) => cached_account
816+
.as_ref()
817+
.map(|cached_account| owners.contains(&cached_account.account.owner())),
823818
LoadedAccountAccessor::Stored(maybe_storage_entry) => {
824819
// storage entry may not be present if slot was cleaned up in
825820
// between reading the accounts index and calling this function to
826821
// get account meta from the storage entry here
827822
maybe_storage_entry
828823
.as_ref()
829824
.and_then(|(storage_entry, offset)| {
830-
storage_entry.accounts.get_account_meta(*offset)
825+
storage_entry
826+
.accounts
827+
.account_matches_owners(*offset, owners)
831828
})
832829
}
833830
}
@@ -4936,31 +4933,31 @@ impl AccountsDb {
49364933
self.do_load(ancestors, pubkey, None, load_hint, LoadZeroLamports::None)
49374934
}
49384935

4939-
pub fn get_account_meta(&self, ancestors: &Ancestors, pubkey: &Pubkey) -> Option<AccountMeta> {
4936+
pub fn account_matches_owners(
4937+
&self,
4938+
ancestors: &Ancestors,
4939+
account: &Pubkey,
4940+
owners: &[&Pubkey],
4941+
) -> Option<bool> {
49404942
let (slot, storage_location, _maybe_account_accesor) =
4941-
self.read_index_for_accessor_or_load_slow(ancestors, pubkey, None, false)?;
4943+
self.read_index_for_accessor_or_load_slow(ancestors, account, None, false)?;
49424944

49434945
if !storage_location.is_cached() {
4944-
let result = self.read_only_accounts_cache.load(*pubkey, slot);
4946+
let result = self.read_only_accounts_cache.load(*account, slot);
49454947
if let Some(account) = result {
4946-
return Some(AccountMeta {
4947-
lamports: account.lamports(),
4948-
rent_epoch: account.rent_epoch(),
4949-
owner: *account.owner(),
4950-
executable: account.executable(),
4951-
});
4948+
return Some(owners.contains(&account.owner()));
49524949
}
49534950
}
49544951

49554952
let (account_accessor, _slot) = self.retry_to_get_account_accessor(
49564953
slot,
49574954
storage_location,
49584955
ancestors,
4959-
pubkey,
4956+
account,
49604957
None,
49614958
LoadHint::Unspecified,
49624959
)?;
4963-
account_accessor.get_account_meta()
4960+
account_accessor.account_matches_owners(owners)
49644961
}
49654962

49664963
pub fn load_account_into_read_cache(&self, ancestors: &Ancestors, pubkey: &Pubkey) {
@@ -14133,43 +14130,54 @@ pub mod tests {
1413314130
}
1413414131

1413514132
#[test]
14136-
fn test_get_account_meta() {
14133+
fn test_account_matches_owners() {
1413714134
let db = Arc::new(AccountsDb::new_with_config_for_tests(
1413814135
Vec::new(),
1413914136
&ClusterType::Development,
1414014137
AccountSecondaryIndexes::default(),
1414114138
AccountShrinkThreshold::default(),
1414214139
));
1414314140

14141+
let owners: Vec<Pubkey> = (0..2).map(|_| Pubkey::new_unique()).collect();
14142+
let owners_refs: Vec<&Pubkey> = owners.iter().collect();
14143+
1414414144
let account1_key = Pubkey::new_unique();
14145-
let owner1_key = Pubkey::new_unique();
14146-
let account1 = AccountSharedData::new(321, 10, &owner1_key);
14145+
let account1 = AccountSharedData::new(321, 10, &owners[0]);
1414714146

1414814147
let account2_key = Pubkey::new_unique();
14149-
let owner2_key = Pubkey::new_unique();
14150-
let account2 = AccountSharedData::new(1, 1, &owner2_key);
14148+
let account2 = AccountSharedData::new(1, 1, &owners[1]);
14149+
14150+
let account3_key = Pubkey::new_unique();
14151+
let account3 = AccountSharedData::new(1, 1, &Pubkey::new_unique());
1415114152

1415214153
db.store_cached((0, &[(&account1_key, &account1)][..]), None);
1415314154
db.store_cached((1, &[(&account2_key, &account2)][..]), None);
14155+
db.store_cached((2, &[(&account3_key, &account3)][..]), None);
1415414156

1415514157
db.add_root(0);
1415614158
db.add_root(1);
14159+
db.add_root(2);
1415714160

1415814161
// Flush the cache so that the account meta will be read from the storage
1415914162
db.flush_accounts_cache(true, None);
1416014163
db.clean_accounts_for_tests();
1416114164

14162-
let account_meta = db
14163-
.get_account_meta(&Ancestors::default(), &account1_key)
14164-
.unwrap();
14165-
assert_eq!(account_meta.lamports, 321);
14166-
assert_eq!(account_meta.owner, owner1_key);
14167-
14168-
let account_meta = db
14169-
.get_account_meta(&Ancestors::default(), &account2_key)
14170-
.unwrap();
14171-
assert_eq!(account_meta.lamports, 1);
14172-
assert_eq!(account_meta.owner, owner2_key);
14165+
assert_eq!(
14166+
db.account_matches_owners(&Ancestors::default(), &account1_key, &owners_refs),
14167+
Some(true)
14168+
);
14169+
assert_eq!(
14170+
db.account_matches_owners(&Ancestors::default(), &account2_key, &owners_refs),
14171+
Some(true)
14172+
);
14173+
assert_eq!(
14174+
db.account_matches_owners(&Ancestors::default(), &account3_key, &owners_refs),
14175+
Some(false)
14176+
);
14177+
assert_eq!(
14178+
db.account_matches_owners(&Ancestors::default(), &Pubkey::new_unique(), &owners_refs),
14179+
None
14180+
);
1417314181

1417414182
// Flush the cache and load account1 (so that it's in the cache)
1417514183
db.flush_accounts_cache(true, None);
@@ -14184,17 +14192,22 @@ pub mod tests {
1418414192
)
1418514193
.unwrap();
1418614194

14187-
let account_meta = db
14188-
.get_account_meta(&Ancestors::default(), &account1_key)
14189-
.unwrap();
14190-
assert_eq!(account_meta.lamports, 321);
14191-
assert_eq!(account_meta.owner, owner1_key);
14192-
14193-
let account_meta = db
14194-
.get_account_meta(&Ancestors::default(), &account2_key)
14195-
.unwrap();
14196-
assert_eq!(account_meta.lamports, 1);
14197-
assert_eq!(account_meta.owner, owner2_key);
14195+
assert_eq!(
14196+
db.account_matches_owners(&Ancestors::default(), &account1_key, &owners_refs),
14197+
Some(true)
14198+
);
14199+
assert_eq!(
14200+
db.account_matches_owners(&Ancestors::default(), &account2_key, &owners_refs),
14201+
Some(true)
14202+
);
14203+
assert_eq!(
14204+
db.account_matches_owners(&Ancestors::default(), &account3_key, &owners_refs),
14205+
Some(false)
14206+
);
14207+
assert_eq!(
14208+
db.account_matches_owners(&Ancestors::default(), &Pubkey::new_unique(), &owners_refs),
14209+
None
14210+
);
1419814211
}
1419914212

1420014213
/// a test that will accept either answer

runtime/src/append_vec.rs

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -594,15 +594,17 @@ impl AppendVec {
594594
))
595595
}
596596

597-
/// Return account metadata for the account at `offset` if its data doesn't overrun
598-
/// the internal buffer. Otherwise return None.
599-
pub fn get_account_meta(&self, offset: usize) -> Option<AccountMeta> {
597+
/// Return Some(true) if the account owner at `offset` is one of the pubkeys in `owners`.
598+
/// Return Some(false) if the account owner is not one of the pubkeys in `owners`.
599+
/// It returns None if the `offset` value causes a data overrun.
600+
pub fn account_matches_owners(&self, offset: usize, owners: &[&Pubkey]) -> Option<bool> {
600601
// Skip over StoredMeta data in the account
601602
let offset = offset.checked_add(mem::size_of::<StoredMeta>())?;
602603
// u64_align! does an unchecked add for alignment. Check that it won't cause an overflow.
603604
offset.checked_add(ALIGN_BOUNDARY_OFFSET - 1)?;
604605
let (account_meta, _): (&AccountMeta, _) = self.get_type(u64_align!(offset))?;
605-
Some(account_meta.clone())
606+
607+
Some(owners.contains(&&account_meta.owner))
606608
}
607609

608610
#[cfg(test)]
@@ -1059,50 +1061,38 @@ pub mod tests {
10591061
}
10601062

10611063
#[test]
1062-
fn test_get_account_meta() {
1064+
fn test_account_matches_owners() {
10631065
let path = get_append_vec_path("test_append_data");
10641066
let av = AppendVec::new(&path.path, true, 1024 * 1024);
1065-
let mut account = create_test_account(5);
1066-
1067-
let test_account_meta = AccountMeta {
1068-
lamports: 12345678,
1069-
rent_epoch: 123,
1070-
owner: Pubkey::new_unique(),
1071-
executable: true,
1072-
};
1073-
account.1.set_lamports(test_account_meta.lamports);
1074-
account.1.set_rent_epoch(test_account_meta.rent_epoch);
1075-
account.1.set_owner(test_account_meta.owner);
1076-
account.1.set_executable(test_account_meta.executable);
1067+
let owners: Vec<Pubkey> = (0..2).map(|_| Pubkey::new_unique()).collect();
1068+
let owners_refs: Vec<&Pubkey> = owners.iter().collect();
10771069

1070+
let mut account = create_test_account(5);
1071+
account.1.set_owner(owners[0]);
10781072
let index = av.append_account_test(&account).unwrap();
1079-
assert_eq!(av.get_account_meta(index), Some(test_account_meta.clone()));
1073+
assert_eq!(av.account_matches_owners(index, &owners_refs), Some(true));
10801074

10811075
let mut account1 = create_test_account(6);
1082-
let test_account_meta1 = AccountMeta {
1083-
lamports: 87654321,
1084-
rent_epoch: 234,
1085-
owner: Pubkey::new_unique(),
1086-
executable: false,
1087-
};
1088-
account1.1.set_lamports(test_account_meta1.lamports);
1089-
account1.1.set_rent_epoch(test_account_meta1.rent_epoch);
1090-
account1.1.set_owner(test_account_meta1.owner);
1091-
account1.1.set_executable(test_account_meta1.executable);
1092-
1076+
account1.1.set_owner(owners[1]);
10931077
let index1 = av.append_account_test(&account1).unwrap();
1094-
assert_eq!(av.get_account_meta(index1), Some(test_account_meta1));
1095-
assert_eq!(av.get_account_meta(index), Some(test_account_meta));
1078+
assert_eq!(av.account_matches_owners(index1, &owners_refs), Some(true));
1079+
assert_eq!(av.account_matches_owners(index, &owners_refs), Some(true));
1080+
1081+
let mut account2 = create_test_account(6);
1082+
account2.1.set_owner(Pubkey::new_unique());
1083+
let index2 = av.append_account_test(&account2).unwrap();
1084+
assert_eq!(av.account_matches_owners(index2, &owners_refs), Some(false));
10961085

10971086
// tests for overflow
10981087
assert_eq!(
1099-
av.get_account_meta(usize::MAX - mem::size_of::<StoredMeta>()),
1088+
av.account_matches_owners(usize::MAX - mem::size_of::<StoredMeta>(), &owners_refs),
11001089
None
11011090
);
11021091

11031092
assert_eq!(
1104-
av.get_account_meta(
1105-
usize::MAX - mem::size_of::<StoredMeta>() - mem::size_of::<AccountMeta>() + 1
1093+
av.account_matches_owners(
1094+
usize::MAX - mem::size_of::<StoredMeta>() - mem::size_of::<AccountMeta>() + 1,
1095+
&owners_refs
11061096
),
11071097
None
11081098
);

0 commit comments

Comments
 (0)