Switches order of tiered storage footer size and version (#34310)

This commit is contained in:
Brooks 2023-12-04 14:23:56 -05:00 committed by GitHub
parent 4bba59f063
commit 2c033e05e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 22 additions and 20 deletions

View File

@ -136,12 +136,12 @@ pub struct TieredStorageFooter {
/// A hash that represents a tiered accounts file for consistency check.
pub hash: Hash,
/// The format version of the tiered accounts file.
pub format_version: u64,
// The below fields belong to footer tail.
// The sum of their sizes should match FOOTER_TAIL_SIZE.
/// The size of the footer including the magic number.
pub footer_size: u64,
/// The format version of the tiered accounts file.
pub format_version: u64,
// This field is persisted in the storage but not in this struct.
// The number should match FOOTER_MAGIC_NUMBER.
// pub magic_number: u64,
@ -166,8 +166,8 @@ const _: () = assert!(
+ std::mem::size_of::<Pubkey>() // min_account_address
+ std::mem::size_of::<Pubkey>() // max_account_address
+ std::mem::size_of::<Hash>() // hash
+ std::mem::size_of::<u64>() // footer_size
+ std::mem::size_of::<u64>(), // format_version
+ std::mem::size_of::<u64>() // format_version
+ std::mem::size_of::<u64>(), // footer_size
"TieredStorageFooter cannot have any padding"
);
@ -188,8 +188,8 @@ impl Default for TieredStorageFooter {
hash: Hash::new_unique(),
min_account_address: Pubkey::default(),
max_account_address: Pubkey::default(),
footer_size: FOOTER_SIZE as u64,
format_version: FOOTER_FORMAT_VERSION,
footer_size: FOOTER_SIZE as u64,
}
}
}
@ -208,8 +208,15 @@ impl TieredStorageFooter {
}
pub fn new_from_footer_block(file: &TieredStorageFile) -> TieredStorageResult<Self> {
let mut footer_size: u64 = 0;
file.seek_from_end(-(FOOTER_TAIL_SIZE as i64))?;
let mut footer_version: u64 = 0;
file.read_type(&mut footer_version)?;
if footer_version != FOOTER_FORMAT_VERSION {
return Err(TieredStorageError::InvalidFooterVersion(footer_version));
}
let mut footer_size: u64 = 0;
file.read_type(&mut footer_size)?;
if footer_size != FOOTER_SIZE as u64 {
return Err(TieredStorageError::InvalidFooterSize(
@ -218,12 +225,6 @@ impl TieredStorageFooter {
));
}
let mut footer_version: u64 = 0;
file.read_type(&mut footer_version)?;
if footer_version != FOOTER_FORMAT_VERSION {
return Err(TieredStorageError::InvalidFooterVersion(footer_version));
}
let mut magic_number = TieredStorageMagicNumber::zeroed();
file.read_type(&mut magic_number)?;
if magic_number != TieredStorageMagicNumber::default() {
@ -243,6 +244,12 @@ impl TieredStorageFooter {
pub fn new_from_mmap(mmap: &Mmap) -> TieredStorageResult<&TieredStorageFooter> {
let offset = mmap.len().saturating_sub(FOOTER_TAIL_SIZE);
let (footer_version, offset) = get_type::<u64>(mmap, offset)?;
if *footer_version != FOOTER_FORMAT_VERSION {
return Err(TieredStorageError::InvalidFooterVersion(*footer_version));
}
let (&footer_size, offset) = get_type::<u64>(mmap, offset)?;
if footer_size != FOOTER_SIZE as u64 {
return Err(TieredStorageError::InvalidFooterSize(
@ -251,11 +258,6 @@ impl TieredStorageFooter {
));
}
let (footer_version, offset) = get_type::<u64>(mmap, offset)?;
if *footer_version != FOOTER_FORMAT_VERSION {
return Err(TieredStorageError::InvalidFooterVersion(*footer_version));
}
let (magic_number, _offset) = get_type::<TieredStorageMagicNumber>(mmap, offset)?;
if *magic_number != TieredStorageMagicNumber::default() {
return Err(TieredStorageError::MagicNumberMismatch(
@ -353,8 +355,8 @@ mod tests {
hash: Hash::new_unique(),
min_account_address: Pubkey::default(),
max_account_address: Pubkey::new_unique(),
footer_size: FOOTER_SIZE as u64,
format_version: FOOTER_FORMAT_VERSION,
footer_size: FOOTER_SIZE as u64,
};
// Persist the expected footer.
@ -390,8 +392,8 @@ mod tests {
assert_eq!(offset_of!(TieredStorageFooter, min_account_address), 0x30);
assert_eq!(offset_of!(TieredStorageFooter, max_account_address), 0x50);
assert_eq!(offset_of!(TieredStorageFooter, hash), 0x70);
assert_eq!(offset_of!(TieredStorageFooter, footer_size), 0x90);
assert_eq!(offset_of!(TieredStorageFooter, format_version), 0x98);
assert_eq!(offset_of!(TieredStorageFooter, format_version), 0x90);
assert_eq!(offset_of!(TieredStorageFooter, footer_size), 0x98);
}
#[test]