[TieredStorage] TieredStorageReader:: and HotStorageReader:: accounts() (#35031)
#### Problem HotStorageReader and TieredStorageReader haven't implemented accounts() that is required by AcocuntsFile. #### Summary of Changes This PR implements accounts() for both HotStorageReader and TieredStorageReader #### Test Plan Extend the existing test to cover accounts().
This commit is contained in:
parent
bf95f65ce1
commit
dd30175e55
|
@ -458,6 +458,24 @@ impl HotStorageReader {
|
||||||
IndexOffset(index_offset.0.saturating_add(1)),
|
IndexOffset(index_offset.0.saturating_add(1)),
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return a vector of account metadata for each account, starting from
|
||||||
|
/// `index_offset`
|
||||||
|
pub fn accounts(
|
||||||
|
&self,
|
||||||
|
mut index_offset: IndexOffset,
|
||||||
|
) -> TieredStorageResult<Vec<StoredAccountMeta>> {
|
||||||
|
let mut accounts = Vec::with_capacity(
|
||||||
|
self.footer
|
||||||
|
.account_entry_count
|
||||||
|
.saturating_sub(index_offset.0) as usize,
|
||||||
|
);
|
||||||
|
while let Some((account, next)) = self.get_account(index_offset)? {
|
||||||
|
accounts.push(account);
|
||||||
|
index_offset = next;
|
||||||
|
}
|
||||||
|
Ok(accounts)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_optional_fields(
|
fn write_optional_fields(
|
||||||
|
@ -1402,5 +1420,21 @@ pub mod tests {
|
||||||
storable_accounts.get(stored_info.offset);
|
storable_accounts.get(stored_info.offset);
|
||||||
verify_account(&stored_meta, account, address, account_hash);
|
verify_account(&stored_meta, account, address, account_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// verify get_accounts
|
||||||
|
let accounts = hot_storage.accounts(IndexOffset(0)).unwrap();
|
||||||
|
|
||||||
|
// first, we verify everything
|
||||||
|
for (i, stored_meta) in accounts.iter().enumerate() {
|
||||||
|
let (account, address, account_hash, _write_version) = storable_accounts.get(i);
|
||||||
|
verify_account(stored_meta, account, address, account_hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
// second, we verify various initial position
|
||||||
|
let total_stored_accounts = accounts.len();
|
||||||
|
for i in 0..total_stored_accounts {
|
||||||
|
let partial_accounts = hot_storage.accounts(IndexOffset(i as u32)).unwrap();
|
||||||
|
assert_eq!(&partial_accounts, &accounts[i..]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,4 +148,15 @@ impl TieredStorageReader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return a vector of account metadata for each account, starting from
|
||||||
|
/// `index_offset`
|
||||||
|
pub fn accounts(
|
||||||
|
&self,
|
||||||
|
index_offset: IndexOffset,
|
||||||
|
) -> TieredStorageResult<Vec<StoredAccountMeta>> {
|
||||||
|
match self {
|
||||||
|
Self::Hot(hot) => hot.accounts(index_offset),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue