Skip to content

Commit

Permalink
[TieredStorage] TieredStorageReader:: and HotStorageReader:: accounts…
Browse files Browse the repository at this point in the history
…() (solana-labs#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().
  • Loading branch information
yhchiang-sol authored Feb 2, 2024
1 parent bf95f65 commit dd30175
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
34 changes: 34 additions & 0 deletions accounts-db/src/tiered_storage/hot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,24 @@ impl HotStorageReader {
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(
Expand Down Expand Up @@ -1402,5 +1420,21 @@ pub mod tests {
storable_accounts.get(stored_info.offset);
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..]);
}
}
}
11 changes: 11 additions & 0 deletions accounts-db/src/tiered_storage/readable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
}
}
}

0 comments on commit dd30175

Please sign in to comment.