From f59887077afbd90e4a077970b157c1c3fd1d3f3f Mon Sep 17 00:00:00 2001 From: Yueh-Hsuan Chiang <93241502+yhchiang-sol@users.noreply.github.com> Date: Thu, 16 Nov 2023 12:48:33 -0800 Subject: [PATCH] [TieredStorage] Define OwnerOffset as u32 (#34105) #### Problem The current OwnerOffset is defined as usize, which actual size could be u32 or u64. On the other hand, the OwnerOffset is used to access the ith owner in one TieredStorageFile. As a result, u32 is more than enough to represent the number of owners inside one TieredStorageFile while u16 might not be always enough. #### Summary of Changes This PR defines OwnerOffset as u32. #### Test Plan Existing test cases. --- accounts-db/src/tiered_storage/hot.rs | 4 +++- accounts-db/src/tiered_storage/owners.rs | 11 +++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/accounts-db/src/tiered_storage/hot.rs b/accounts-db/src/tiered_storage/hot.rs index cd5924ee10d0b7..a72ab83c5c5414 100644 --- a/accounts-db/src/tiered_storage/hot.rs +++ b/accounts-db/src/tiered_storage/hot.rs @@ -571,7 +571,9 @@ pub mod tests { let hot_storage = HotStorageReader::new_from_path(&path).unwrap(); for (i, address) in addresses.iter().enumerate() { assert_eq!( - hot_storage.get_owner_address(OwnerOffset(i)).unwrap(), + hot_storage + .get_owner_address(OwnerOffset(i as u32)) + .unwrap(), address, ); } diff --git a/accounts-db/src/tiered_storage/owners.rs b/accounts-db/src/tiered_storage/owners.rs index 10ea4cc94b9cf4..1f570674cd47b6 100644 --- a/accounts-db/src/tiered_storage/owners.rs +++ b/accounts-db/src/tiered_storage/owners.rs @@ -15,8 +15,11 @@ pub struct OwnersBlock; /// The offset to an owner entry in the owners block. /// This is used to obtain the address of the account owner. +/// +/// Note that as its internal type is u32, it means the maximum number of +/// unique owners in one TieredStorageFile is 2^32. #[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub struct OwnerOffset(pub usize); +pub struct OwnerOffset(pub u32); /// OwnersBlock is persisted as a consecutive bytes of pubkeys without any /// meta-data. For each account meta, it has a owner_offset field to @@ -42,8 +45,8 @@ impl OwnersBlock { footer: &TieredStorageFooter, owner_offset: OwnerOffset, ) -> TieredStorageResult<&'a Pubkey> { - let offset = - footer.owners_block_offset as usize + (std::mem::size_of::() * owner_offset.0); + let offset = footer.owners_block_offset as usize + + (std::mem::size_of::() * owner_offset.0 as usize); let (pubkey, _) = get_type::(mmap, offset)?; Ok(pubkey) @@ -90,7 +93,7 @@ mod tests { for (i, address) in addresses.iter().enumerate() { assert_eq!( - OwnersBlock::get_owner_address(&mmap, &footer, OwnerOffset(i)).unwrap(), + OwnersBlock::get_owner_address(&mmap, &footer, OwnerOffset(i as u32)).unwrap(), address ); }