Skip to content

Commit

Permalink
[TieredStorage] Make IndexBlock persist u32 offsets (#34133)
Browse files Browse the repository at this point in the history
#### Problem
In TieredStorage, we want to make AccountOffset and IndexOffset u32 instead
of usize just like OwnerOffset.  However, we need to first change what we persist
in the storage.  Currently, IndexBlock persists offsets as u64 instead of u32. 

#### Summary of Changes
This PR makes IndexBlock persist u32 offsets.

#### Test Plan
Existing test cases.
  • Loading branch information
yhchiang-sol authored Nov 17, 2023
1 parent e23bfb5 commit 625e898
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 20 deletions.
2 changes: 1 addition & 1 deletion accounts-db/src/tiered_storage/footer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ mod tests {
let expected_footer = TieredStorageFooter {
account_meta_format: AccountMetaFormat::Hot,
owners_block_format: OwnersBlockFormat::LocalIndex,
index_block_format: IndexBlockFormat::AddressAndOffset,
index_block_format: IndexBlockFormat::AddressAndBlockOffsetOnly,
account_block_format: AccountBlockFormat::AlignedRaw,
account_entry_count: 300,
account_meta_entry_size: 24,
Expand Down
8 changes: 4 additions & 4 deletions accounts-db/src/tiered_storage/hot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ pub const HOT_FORMAT: TieredStorageFormat = TieredStorageFormat {
meta_entry_size: std::mem::size_of::<HotAccountMeta>(),
account_meta_format: AccountMetaFormat::Hot,
owners_block_format: OwnersBlockFormat::LocalIndex,
index_block_format: IndexBlockFormat::AddressAndOffset,
index_block_format: IndexBlockFormat::AddressAndBlockOffsetOnly,
account_block_format: AccountBlockFormat::AlignedRaw,
};

Expand Down Expand Up @@ -407,7 +407,7 @@ pub mod tests {
let expected_footer = TieredStorageFooter {
account_meta_format: AccountMetaFormat::Hot,
owners_block_format: OwnersBlockFormat::LocalIndex,
index_block_format: IndexBlockFormat::AddressAndOffset,
index_block_format: IndexBlockFormat::AddressAndBlockOffsetOnly,
account_block_format: AccountBlockFormat::AlignedRaw,
account_entry_count: 300,
account_meta_entry_size: 16,
Expand Down Expand Up @@ -503,7 +503,7 @@ pub mod tests {
.iter()
.map(|address| AccountIndexWriterEntry {
address,
block_offset: rng.gen_range(0..u64::MAX),
block_offset: rng.gen_range(0..u32::MAX),
intra_block_offset: rng.gen_range(0..4096),
})
.collect();
Expand Down Expand Up @@ -532,7 +532,7 @@ pub mod tests {
let hot_storage = HotStorageReader::new_from_path(&path).unwrap();
for (i, index_writer_entry) in index_writer_entries.iter().enumerate() {
let account_offset = hot_storage.get_account_offset(IndexOffset(i)).unwrap();
assert_eq!(account_offset.block as u64, index_writer_entry.block_offset);
assert_eq!(account_offset.block as u32, index_writer_entry.block_offset);

let account_address = hot_storage.get_account_address(IndexOffset(i)).unwrap();
assert_eq!(account_address, index_writer_entry.address);
Expand Down
33 changes: 18 additions & 15 deletions accounts-db/src/tiered_storage/index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ use {
#[derive(Debug)]
pub struct AccountIndexWriterEntry<'a> {
pub address: &'a Pubkey,
pub block_offset: u64,
pub intra_block_offset: u64,
pub block_offset: u32,
pub intra_block_offset: u32,
}

/// The offset to an account stored inside its accounts block.
Expand Down Expand Up @@ -47,10 +47,10 @@ pub struct IndexOffset(pub usize);
)]
pub enum IndexBlockFormat {
/// This format optimizes the storage size by storing only account addresses
/// and offsets. It skips storing the size of account data by storing account
/// block entries and index block entries in the same order.
/// and block offsets. It skips storing the size of account data by storing
/// account block entries and index block entries in the same order.
#[default]
AddressAndOffset = 0,
AddressAndBlockOffsetOnly = 0,
}

impl IndexBlockFormat {
Expand All @@ -62,7 +62,7 @@ impl IndexBlockFormat {
index_entries: &[AccountIndexWriterEntry],
) -> TieredStorageResult<usize> {
match self {
Self::AddressAndOffset => {
Self::AddressAndBlockOffsetOnly => {
let mut bytes_written = 0;
for index_entry in index_entries {
bytes_written += file.write_type(index_entry.address)?;
Expand All @@ -83,7 +83,7 @@ impl IndexBlockFormat {
index_offset: IndexOffset,
) -> TieredStorageResult<&'a Pubkey> {
let account_offset = match self {
Self::AddressAndOffset => {
Self::AddressAndBlockOffsetOnly => {
footer.index_block_offset as usize + std::mem::size_of::<Pubkey>() * index_offset.0
}
};
Expand All @@ -99,13 +99,14 @@ impl IndexBlockFormat {
index_offset: IndexOffset,
) -> TieredStorageResult<AccountOffset> {
match self {
Self::AddressAndOffset => {
Self::AddressAndBlockOffsetOnly => {
let account_offset = footer.index_block_offset as usize
+ std::mem::size_of::<Pubkey>() * footer.account_entry_count as usize
+ index_offset.0 * std::mem::size_of::<u64>();
let (account_block_offset, _) = get_type(mmap, account_offset)?;
+ index_offset.0 * std::mem::size_of::<u32>();
let (block_offset, _) = get_type::<u32>(mmap, account_offset)?;

Ok(AccountOffset {
block: *account_block_offset,
block: *block_offset as usize,
})
}
}
Expand All @@ -114,7 +115,9 @@ impl IndexBlockFormat {
/// Returns the size of one index entry.
pub fn entry_size(&self) -> usize {
match self {
Self::AddressAndOffset => std::mem::size_of::<Pubkey>() + std::mem::size_of::<u64>(),
Self::AddressAndBlockOffsetOnly => {
std::mem::size_of::<Pubkey>() + std::mem::size_of::<u32>()
}
}
}
}
Expand Down Expand Up @@ -150,11 +153,11 @@ mod tests {

{
let file = TieredStorageFile::new_writable(&path).unwrap();
let indexer = IndexBlockFormat::AddressAndOffset;
let indexer = IndexBlockFormat::AddressAndBlockOffsetOnly;
indexer.write_index_block(&file, &index_entries).unwrap();
}

let indexer = IndexBlockFormat::AddressAndOffset;
let indexer = IndexBlockFormat::AddressAndBlockOffsetOnly;
let file = OpenOptions::new()
.read(true)
.create(false)
Expand All @@ -165,7 +168,7 @@ mod tests {
let account_offset = indexer
.get_account_offset(&mmap, &footer, IndexOffset(i))
.unwrap();
assert_eq!(index_entry.block_offset, account_offset.block as u64);
assert_eq!(index_entry.block_offset, account_offset.block as u32);
let address = indexer
.get_account_address(&mmap, &footer, IndexOffset(i))
.unwrap();
Expand Down

0 comments on commit 625e898

Please sign in to comment.