[TieredAccountStorage] functions for obtaining optional fields offsets (#32311)
#### Summary of Changes This PR adds several functions to AccountMetaOptionalFields for obtaining the offset of each optional field. #### Test Plan New unit test cases are included in this PR.
This commit is contained in:
parent
794f3849a4
commit
5e830d2692
|
@ -156,6 +156,34 @@ impl AccountMetaOptionalFields {
|
||||||
|
|
||||||
fields_size
|
fields_size
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Given the specified AccountMetaFlags, returns the relative offset
|
||||||
|
/// of its rent_epoch field to the offset of its optional fields entry.
|
||||||
|
pub fn rent_epoch_offset(_flags: &AccountMetaFlags) -> usize {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Given the specified AccountMetaFlags, returns the relative offset
|
||||||
|
/// of its account_hash field to the offset of its optional fields entry.
|
||||||
|
pub fn account_hash_offset(flags: &AccountMetaFlags) -> usize {
|
||||||
|
let mut offset = Self::rent_epoch_offset(flags);
|
||||||
|
// rent_epoch is the previous field to account hash
|
||||||
|
if flags.has_rent_epoch() {
|
||||||
|
offset += std::mem::size_of::<Epoch>();
|
||||||
|
}
|
||||||
|
offset
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Given the specified AccountMetaFlags, returns the relative offset
|
||||||
|
/// of its write_version field to the offset of its optional fields entry.
|
||||||
|
pub fn write_version_offset(flags: &AccountMetaFlags) -> usize {
|
||||||
|
let mut offset = Self::account_hash_offset(flags);
|
||||||
|
// account hash is the previous field to write version
|
||||||
|
if flags.has_account_hash() {
|
||||||
|
offset += std::mem::size_of::<Hash>();
|
||||||
|
}
|
||||||
|
offset
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -269,4 +297,52 @@ pub mod tests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_optional_fields_offset() {
|
||||||
|
let test_epoch = 5432312;
|
||||||
|
let test_write_version = 231;
|
||||||
|
|
||||||
|
for rent_epoch in [None, Some(test_epoch)] {
|
||||||
|
let rent_epoch_offset = 0;
|
||||||
|
for account_hash in [None, Some(Hash::new_unique())] {
|
||||||
|
let mut account_hash_offset = rent_epoch_offset;
|
||||||
|
if rent_epoch.is_some() {
|
||||||
|
account_hash_offset += std::mem::size_of::<Epoch>();
|
||||||
|
}
|
||||||
|
for write_version in [None, Some(test_write_version)] {
|
||||||
|
let mut write_version_offset = account_hash_offset;
|
||||||
|
if account_hash.is_some() {
|
||||||
|
write_version_offset += std::mem::size_of::<Hash>();
|
||||||
|
}
|
||||||
|
let opt_fields = AccountMetaOptionalFields {
|
||||||
|
rent_epoch,
|
||||||
|
account_hash,
|
||||||
|
write_version,
|
||||||
|
};
|
||||||
|
let flags = AccountMetaFlags::new_from(&opt_fields);
|
||||||
|
assert_eq!(
|
||||||
|
AccountMetaOptionalFields::rent_epoch_offset(&flags),
|
||||||
|
rent_epoch_offset
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
AccountMetaOptionalFields::account_hash_offset(&flags),
|
||||||
|
account_hash_offset
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
AccountMetaOptionalFields::write_version_offset(&flags),
|
||||||
|
write_version_offset
|
||||||
|
);
|
||||||
|
let mut derived_size = AccountMetaOptionalFields::write_version_offset(&flags);
|
||||||
|
if flags.has_write_version() {
|
||||||
|
derived_size += std::mem::size_of::<StoredMetaWriteVersion>();
|
||||||
|
}
|
||||||
|
assert_eq!(
|
||||||
|
AccountMetaOptionalFields::size_from_flags(&flags),
|
||||||
|
derived_size
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue