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

[TieredStorage] Make IndexBlock persist u32 offsets #34133

Merged
merged 2 commits into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,
brooksprumo marked this conversation as resolved.
Show resolved Hide resolved
}

/// 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,
brooksprumo marked this conversation as resolved.
Show resolved Hide resolved
}

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)?;
brooksprumo marked this conversation as resolved.
Show resolved Hide resolved

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