Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TieredStorage] Add AccountsFile::TieredStorage #72

Merged
merged 1 commit into from
Mar 24, 2024
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
50 changes: 47 additions & 3 deletions accounts-db/src/accounts_file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ use {
accounts_hash::AccountHash,
append_vec::{AppendVec, AppendVecError},
storable_accounts::StorableAccounts,
tiered_storage::error::TieredStorageError,
tiered_storage::{
error::TieredStorageError, hot::HOT_FORMAT, index::IndexOffset, TieredStorage,
},
},
solana_sdk::{account::ReadableAccount, clock::Slot, pubkey::Pubkey},
std::{
Expand Down Expand Up @@ -56,6 +58,7 @@ pub type Result<T> = std::result::Result<T, AccountsFileError>;
/// under different formats.
pub enum AccountsFile {
AppendVec(AppendVec),
TieredStorage(TieredStorage),
}

impl AccountsFile {
Expand All @@ -64,43 +67,62 @@ impl AccountsFile {
/// The second element of the returned tuple is the number of accounts in the
/// accounts file.
pub fn new_from_file(path: impl AsRef<Path>, current_len: usize) -> Result<(Self, usize)> {
let (av, num_accounts) = AppendVec::new_from_file(path, current_len)?;
Ok((Self::AppendVec(av), num_accounts))
match TieredStorage::new_readonly(path.as_ref()) {
yhchiang-sol marked this conversation as resolved.
Show resolved Hide resolved
Ok(tiered_storage) => {
// unwrap() note: TieredStorage::new_readonly() is guaranteed to have a valid
// reader instance when opening with new_readonly.
let num_accounts = tiered_storage.reader().unwrap().num_accounts();
Ok((Self::TieredStorage(tiered_storage), num_accounts))
}
Err(TieredStorageError::MagicNumberMismatch(_, _)) => {
// In case of MagicNumberMismatch, we can assume that this is not
// a tiered-storage file.
let (av, num_accounts) = AppendVec::new_from_file(path, current_len)?;
Ok((Self::AppendVec(av), num_accounts))
}
Err(e) => Err(AccountsFileError::TieredStorageError(e)),
}
}

pub fn flush(&self) -> Result<()> {
match self {
Self::AppendVec(av) => av.flush(),
Self::TieredStorage(_) => Ok(()),
}
}

pub fn reset(&self) {
match self {
Self::AppendVec(av) => av.reset(),
Self::TieredStorage(_) => {}
}
}

pub fn remaining_bytes(&self) -> u64 {
match self {
Self::AppendVec(av) => av.remaining_bytes(),
Self::TieredStorage(ts) => ts.capacity().saturating_sub(ts.len() as u64),
}
}

pub fn len(&self) -> usize {
match self {
Self::AppendVec(av) => av.len(),
Self::TieredStorage(ts) => ts.len(),
}
}

pub fn is_empty(&self) -> bool {
match self {
Self::AppendVec(av) => av.is_empty(),
Self::TieredStorage(ts) => ts.is_empty(),
}
}

pub fn capacity(&self) -> u64 {
match self {
Self::AppendVec(av) => av.capacity(),
Self::TieredStorage(ts) => ts.capacity(),
}
}

Expand All @@ -114,6 +136,11 @@ impl AccountsFile {
pub fn get_account(&self, index: usize) -> Option<(StoredAccountMeta<'_>, usize)> {
match self {
Self::AppendVec(av) => av.get_account(index),
Self::TieredStorage(ts) => ts
.reader()?
.get_account(IndexOffset(index as u32))
.ok()?
.map(|(metas, index_offset)| (metas, index_offset.0 as usize)),
}
}

Expand All @@ -124,13 +151,20 @@ impl AccountsFile {
) -> std::result::Result<usize, MatchAccountOwnerError> {
match self {
Self::AppendVec(av) => av.account_matches_owners(offset, owners),
Self::TieredStorage(ts) => {
let Some(reader) = ts.reader() else {
return Err(MatchAccountOwnerError::UnableToLoad);
};
reader.account_matches_owners(IndexOffset(offset as u32), owners)
}
}
}

/// Return the path of the underlying account file.
pub fn get_path(&self) -> PathBuf {
match self {
Self::AppendVec(av) => av.get_path(),
Self::TieredStorage(ts) => ts.path().to_path_buf(),
}
}

Expand All @@ -143,6 +177,10 @@ impl AccountsFile {
pub fn accounts(&self, offset: usize) -> Vec<StoredAccountMeta> {
match self {
Self::AppendVec(av) => av.accounts(offset),
Self::TieredStorage(ts) => ts
.reader()
.and_then(|reader| reader.accounts(IndexOffset(offset as u32)).ok())
.unwrap_or_default(),
}
}

Expand All @@ -166,6 +204,11 @@ impl AccountsFile {
) -> Option<Vec<StoredAccountInfo>> {
match self {
Self::AppendVec(av) => av.append_accounts(accounts, skip),
// Currently we only support HOT_FORMAT. If we later want to use
// a different format, then we will need a way to pass-in it.
// TODO: consider adding function like write_accounts_to_hot_storage() or something
// to hide implementation detail.
Self::TieredStorage(ts) => ts.write_accounts(accounts, skip, &HOT_FORMAT).ok(),
yhchiang-sol marked this conversation as resolved.
Show resolved Hide resolved
}
}
}
Expand Down Expand Up @@ -204,6 +247,7 @@ pub mod tests {
pub(crate) fn set_current_len_for_tests(&self, len: usize) {
match self {
Self::AppendVec(av) => av.set_current_len_for_tests(len),
Self::TieredStorage(_) => {}
}
}
}
Expand Down
4 changes: 1 addition & 3 deletions accounts-db/src/ancient_append_vecs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -966,9 +966,7 @@ pub const fn get_ancient_append_vec_capacity() -> u64 {

/// is this a max-size append vec designed to be used as an ancient append vec?
pub fn is_ancient(storage: &AccountsFile) -> bool {
match storage {
AccountsFile::AppendVec(storage) => storage.capacity() >= get_ancient_append_vec_capacity(),
}
storage.capacity() >= get_ancient_append_vec_capacity()
yhchiang-sol marked this conversation as resolved.
Show resolved Hide resolved
}

#[cfg(test)]
Expand Down
Loading