[TieredStorage] Use OwnerOffset type in TieredAccountMeta (#34106)

#### Problem
TieredAccountMeta currently uses `u32` for owner_offset, while
we already have a dedicate type for that --- OwnerOffset.

#### Summary of Changes
This PR makes TieredAccountMeta use OwnerOffset for its
owner_offset field.

#### Test Plan
Existing unit-tests.
This commit is contained in:
Yueh-Hsuan Chiang 2023-11-17 09:26:52 -08:00 committed by GitHub
parent ca6ab08555
commit 1e9f6d9d83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 30 deletions

View File

@ -34,7 +34,7 @@ pub const HOT_FORMAT: TieredStorageFormat = TieredStorageFormat {
const MAX_HOT_PADDING: u8 = 7; const MAX_HOT_PADDING: u8 = 7;
/// The maximum allowed value for the owner index of a hot account. /// The maximum allowed value for the owner index of a hot account.
const MAX_HOT_OWNER_INDEX: u32 = (1 << 29) - 1; const MAX_HOT_OWNER_OFFSET: OwnerOffset = OwnerOffset((1 << 29) - 1);
#[bitfield(bits = 32)] #[bitfield(bits = 32)]
#[repr(C)] #[repr(C)]
@ -51,7 +51,7 @@ struct HotMetaPackedFields {
/// in its hot account entry. /// in its hot account entry.
padding: B3, padding: B3,
/// The index to the owner of a hot account inside an AccountsFile. /// The index to the owner of a hot account inside an AccountsFile.
owner_index: B29, owner_offset: B29,
} }
/// The storage and in-memory representation of the metadata entry for a /// The storage and in-memory representation of the metadata entry for a
@ -94,11 +94,11 @@ impl TieredAccountMeta for HotAccountMeta {
} }
/// A builder function that initializes the owner's index. /// A builder function that initializes the owner's index.
fn with_owner_index(mut self, owner_index: u32) -> Self { fn with_owner_offset(mut self, owner_offset: OwnerOffset) -> Self {
if owner_index > MAX_HOT_OWNER_INDEX { if owner_offset > MAX_HOT_OWNER_OFFSET {
panic!("owner_index exceeds MAX_HOT_OWNER_INDEX"); panic!("owner_offset exceeds MAX_HOT_OWNER_OFFSET");
} }
self.packed_fields.set_owner_index(owner_index); self.packed_fields.set_owner_offset(owner_offset.0);
self self
} }
@ -127,8 +127,8 @@ impl TieredAccountMeta for HotAccountMeta {
} }
/// Returns the index to the accounts' owner in the current AccountsFile. /// Returns the index to the accounts' owner in the current AccountsFile.
fn owner_index(&self) -> u32 { fn owner_offset(&self) -> OwnerOffset {
self.packed_fields.owner_index() OwnerOffset(self.packed_fields.owner_offset())
} }
/// Returns the AccountMetaFlags of the current meta. /// Returns the AccountMetaFlags of the current meta.
@ -285,31 +285,31 @@ pub mod tests {
#[test] #[test]
fn test_packed_fields() { fn test_packed_fields() {
const TEST_PADDING: u8 = 7; const TEST_PADDING: u8 = 7;
const TEST_OWNER_INDEX: u32 = 0x1fff_ef98; const TEST_OWNER_OFFSET: u32 = 0x1fff_ef98;
let mut packed_fields = HotMetaPackedFields::default(); let mut packed_fields = HotMetaPackedFields::default();
packed_fields.set_padding(TEST_PADDING); packed_fields.set_padding(TEST_PADDING);
packed_fields.set_owner_index(TEST_OWNER_INDEX); packed_fields.set_owner_offset(TEST_OWNER_OFFSET);
assert_eq!(packed_fields.padding(), TEST_PADDING); assert_eq!(packed_fields.padding(), TEST_PADDING);
assert_eq!(packed_fields.owner_index(), TEST_OWNER_INDEX); assert_eq!(packed_fields.owner_offset(), TEST_OWNER_OFFSET);
} }
#[test] #[test]
fn test_packed_fields_max_values() { fn test_packed_fields_max_values() {
let mut packed_fields = HotMetaPackedFields::default(); let mut packed_fields = HotMetaPackedFields::default();
packed_fields.set_padding(MAX_HOT_PADDING); packed_fields.set_padding(MAX_HOT_PADDING);
packed_fields.set_owner_index(MAX_HOT_OWNER_INDEX); packed_fields.set_owner_offset(MAX_HOT_OWNER_OFFSET.0);
assert_eq!(packed_fields.padding(), MAX_HOT_PADDING); assert_eq!(packed_fields.padding(), MAX_HOT_PADDING);
assert_eq!(packed_fields.owner_index(), MAX_HOT_OWNER_INDEX); assert_eq!(packed_fields.owner_offset(), MAX_HOT_OWNER_OFFSET.0);
} }
#[test] #[test]
fn test_hot_meta_max_values() { fn test_hot_meta_max_values() {
let meta = HotAccountMeta::new() let meta = HotAccountMeta::new()
.with_account_data_padding(MAX_HOT_PADDING) .with_account_data_padding(MAX_HOT_PADDING)
.with_owner_index(MAX_HOT_OWNER_INDEX); .with_owner_offset(MAX_HOT_OWNER_OFFSET);
assert_eq!(meta.account_data_padding(), MAX_HOT_PADDING); assert_eq!(meta.account_data_padding(), MAX_HOT_PADDING);
assert_eq!(meta.owner_index(), MAX_HOT_OWNER_INDEX); assert_eq!(meta.owner_offset(), MAX_HOT_OWNER_OFFSET);
} }
#[test] #[test]
@ -319,16 +319,16 @@ pub mod tests {
} }
#[test] #[test]
#[should_panic(expected = "owner_index exceeds MAX_HOT_OWNER_INDEX")] #[should_panic(expected = "owner_offset exceeds MAX_HOT_OWNER_OFFSET")]
fn test_hot_meta_owner_index_exceeds_limit() { fn test_hot_meta_owner_offset_exceeds_limit() {
HotAccountMeta::new().with_owner_index(MAX_HOT_OWNER_INDEX + 1); HotAccountMeta::new().with_owner_offset(OwnerOffset(MAX_HOT_OWNER_OFFSET.0 + 1));
} }
#[test] #[test]
fn test_hot_account_meta() { fn test_hot_account_meta() {
const TEST_LAMPORTS: u64 = 2314232137; const TEST_LAMPORTS: u64 = 2314232137;
const TEST_PADDING: u8 = 5; const TEST_PADDING: u8 = 5;
const TEST_OWNER_INDEX: u32 = 0x1fef_1234; const TEST_OWNER_OFFSET: OwnerOffset = OwnerOffset(0x1fef_1234);
const TEST_RENT_EPOCH: Epoch = 7; const TEST_RENT_EPOCH: Epoch = 7;
let optional_fields = AccountMetaOptionalFields { let optional_fields = AccountMetaOptionalFields {
@ -340,12 +340,12 @@ pub mod tests {
let meta = HotAccountMeta::new() let meta = HotAccountMeta::new()
.with_lamports(TEST_LAMPORTS) .with_lamports(TEST_LAMPORTS)
.with_account_data_padding(TEST_PADDING) .with_account_data_padding(TEST_PADDING)
.with_owner_index(TEST_OWNER_INDEX) .with_owner_offset(TEST_OWNER_OFFSET)
.with_flags(&flags); .with_flags(&flags);
assert_eq!(meta.lamports(), TEST_LAMPORTS); assert_eq!(meta.lamports(), TEST_LAMPORTS);
assert_eq!(meta.account_data_padding(), TEST_PADDING); assert_eq!(meta.account_data_padding(), TEST_PADDING);
assert_eq!(meta.owner_index(), TEST_OWNER_INDEX); assert_eq!(meta.owner_offset(), TEST_OWNER_OFFSET);
assert_eq!(*meta.flags(), flags); assert_eq!(*meta.flags(), flags);
} }
@ -355,7 +355,7 @@ pub mod tests {
let padding = [0u8; 5]; let padding = [0u8; 5];
const TEST_LAMPORT: u64 = 2314232137; const TEST_LAMPORT: u64 = 2314232137;
const OWNER_INDEX: u32 = 0x1fef_1234; const OWNER_OFFSET: u32 = 0x1fef_1234;
const TEST_RENT_EPOCH: Epoch = 7; const TEST_RENT_EPOCH: Epoch = 7;
let optional_fields = AccountMetaOptionalFields { let optional_fields = AccountMetaOptionalFields {
@ -367,7 +367,7 @@ pub mod tests {
let expected_meta = HotAccountMeta::new() let expected_meta = HotAccountMeta::new()
.with_lamports(TEST_LAMPORT) .with_lamports(TEST_LAMPORT)
.with_account_data_padding(padding.len().try_into().unwrap()) .with_account_data_padding(padding.len().try_into().unwrap())
.with_owner_index(OWNER_INDEX) .with_owner_offset(OwnerOffset(OWNER_OFFSET))
.with_flags(&flags); .with_flags(&flags);
let mut writer = ByteBlockWriter::new(AccountBlockFormat::AlignedRaw); let mut writer = ByteBlockWriter::new(AccountBlockFormat::AlignedRaw);
@ -449,7 +449,7 @@ pub mod tests {
.map(|_| { .map(|_| {
HotAccountMeta::new() HotAccountMeta::new()
.with_lamports(rng.gen_range(0..u64::MAX)) .with_lamports(rng.gen_range(0..u64::MAX))
.with_owner_index(rng.gen_range(0..NUM_ACCOUNTS)) .with_owner_offset(OwnerOffset(rng.gen_range(0..NUM_ACCOUNTS)))
}) })
.collect(); .collect();

View File

@ -1,7 +1,8 @@
#![allow(dead_code)] #![allow(dead_code)]
//! The account meta and related structs for the tiered storage. //! The account meta and related structs for the tiered storage.
use { use {
crate::accounts_hash::AccountHash, modular_bitfield::prelude::*, crate::{accounts_hash::AccountHash, tiered_storage::owners::OwnerOffset},
modular_bitfield::prelude::*,
solana_sdk::stake_history::Epoch, solana_sdk::stake_history::Epoch,
}; };
@ -31,8 +32,8 @@ pub trait TieredAccountMeta: Sized {
/// for the account data associated with the current meta. /// for the account data associated with the current meta.
fn with_account_data_padding(self, padding: u8) -> Self; fn with_account_data_padding(self, padding: u8) -> Self;
/// A builder function that initializes the owner's index. /// A builder function that initializes the owner offset.
fn with_owner_index(self, index: u32) -> Self; fn with_owner_offset(self, owner_offset: OwnerOffset) -> Self;
/// A builder function that initializes the account data size. /// A builder function that initializes the account data size.
/// The size here represents the logical data size without compression. /// The size here represents the logical data size without compression.
@ -48,8 +49,8 @@ pub trait TieredAccountMeta: Sized {
/// Returns the number of padding bytes for the associated account data /// Returns the number of padding bytes for the associated account data
fn account_data_padding(&self) -> u8; fn account_data_padding(&self) -> u8;
/// Returns the index to the accounts' owner in the current AccountsFile. /// Returns the offset to the accounts' owner in the current AccountsFile.
fn owner_index(&self) -> u32; fn owner_offset(&self) -> OwnerOffset;
/// Returns the AccountMetaFlags of the current meta. /// Returns the AccountMetaFlags of the current meta.
fn flags(&self) -> &AccountMetaFlags; fn flags(&self) -> &AccountMetaFlags;

View File

@ -18,7 +18,7 @@ pub struct OwnersBlock;
/// ///
/// Note that as its internal type is u32, it means the maximum number of /// Note that as its internal type is u32, it means the maximum number of
/// unique owners in one TieredStorageFile is 2^32. /// unique owners in one TieredStorageFile is 2^32.
#[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd)]
pub struct OwnerOffset(pub u32); pub struct OwnerOffset(pub u32);
/// OwnersBlock is persisted as a consecutive bytes of pubkeys without any /// OwnersBlock is persisted as a consecutive bytes of pubkeys without any