implement scan_pubkeys for hot storage (#666)

This commit is contained in:
Jeff Washington (jwash) 2024-04-09 07:47:26 -05:00 committed by GitHub
parent 8e0a55fe64
commit c0be86d0e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 43 additions and 6 deletions

View File

@ -2418,8 +2418,24 @@ impl AccountsDb {
AccountsDb::new_for_tests(Vec::new(), &ClusterType::Development)
}
pub fn new_single_for_tests_with_provider(file_provider: AccountsFileProvider) -> Self {
AccountsDb::new_for_tests_with_provider(
Vec::new(),
&ClusterType::Development,
file_provider,
)
}
pub fn new_for_tests(paths: Vec<PathBuf>, cluster_type: &ClusterType) -> Self {
AccountsDb::new_with_config(
Self::new_for_tests_with_provider(paths, cluster_type, AccountsFileProvider::default())
}
fn new_for_tests_with_provider(
paths: Vec<PathBuf>,
cluster_type: &ClusterType,
accounts_file_provider: AccountsFileProvider,
) -> Self {
let mut db = AccountsDb::new_with_config(
paths,
cluster_type,
AccountSecondaryIndexes::default(),
@ -2427,7 +2443,9 @@ impl AccountsDb {
Some(ACCOUNTS_DB_CONFIG_FOR_TESTING),
None,
Arc::default(),
)
);
db.accounts_file_provider = accounts_file_provider;
db
}
pub fn new_with_config(
@ -15328,10 +15346,11 @@ pub mod tests {
/// - ensure Account1 has *not* been purged
/// - call `clean_accounts()` with `last_full_snapshot_slot` set to 3
/// - ensure Account1 *has* been purged
#[test]
fn test_clean_accounts_with_last_full_snapshot_slot() {
#[test_case(AccountsFileProvider::AppendVec)]
#[test_case(AccountsFileProvider::HotStorage)]
fn test_clean_accounts_with_last_full_snapshot_slot(file_provider: AccountsFileProvider) {
solana_logger::setup();
let accounts_db = AccountsDb::new_single_for_tests();
let accounts_db = AccountsDb::new_single_for_tests_with_provider(file_provider);
let pubkey = solana_sdk::pubkey::new_rand();
let owner = solana_sdk::pubkey::new_rand();
let space = 0;

View File

@ -197,7 +197,11 @@ impl AccountsFile {
pub(crate) fn scan_pubkeys(&self, callback: impl FnMut(&Pubkey)) {
match self {
Self::AppendVec(av) => av.scan_pubkeys(callback),
Self::TieredStorage(_) => unimplemented!(),
Self::TieredStorage(ts) => {
if let Some(reader) = ts.reader() {
_ = reader.scan_pubkeys(callback);
}
}
}
}

View File

@ -554,6 +554,14 @@ impl HotStorageReader {
Ok(accounts)
}
pub fn scan_pubkeys(&self, mut callback: impl FnMut(&Pubkey)) -> TieredStorageResult<()> {
for i in 0..self.footer.account_entry_count {
let address = self.get_account_address(IndexOffset(i))?;
callback(address);
}
Ok(())
}
/// Returns a slice suitable for use when archiving hot storages
pub fn data_for_archive(&self) -> &[u8] {
self.mmap.as_ref()

View File

@ -109,6 +109,12 @@ impl TieredStorageReader {
}
}
pub fn scan_pubkeys(&self, callback: impl FnMut(&Pubkey)) -> TieredStorageResult<()> {
match self {
Self::Hot(hot) => hot.scan_pubkeys(callback),
}
}
/// Returns a slice suitable for use when archiving tiered storages
pub fn data_for_archive(&self) -> &[u8] {
match self {