diff --git a/core/src/snapshot_packager_service.rs b/core/src/snapshot_packager_service.rs index 2c86efa35a6d08..ca8edd609cdee7 100644 --- a/core/src/snapshot_packager_service.rs +++ b/core/src/snapshot_packager_service.rs @@ -228,7 +228,8 @@ mod tests { snapshot_hash::SnapshotHash, snapshot_package::{SnapshotPackage, SnapshotType}, snapshot_utils::{ - self, ArchiveFormat, SnapshotVersion, SNAPSHOT_STATUS_CACHE_FILENAME, + self, create_accounts_run_and_snapshot_dirs, ArchiveFormat, SnapshotVersion, + SNAPSHOT_STATUS_CACHE_FILENAME, }, }, solana_sdk::hash::Hash, @@ -267,6 +268,10 @@ mod tests { fn create_and_verify_snapshot(temp_dir: &Path) { let accounts_dir = temp_dir.join("accounts"); + let accounts_dir = create_accounts_run_and_snapshot_dirs(accounts_dir) + .unwrap() + .0; + let snapshots_dir = temp_dir.join("snapshots"); let full_snapshot_archives_dir = temp_dir.join("full_snapshot_archives"); let incremental_snapshot_archives_dir = temp_dir.join("incremental_snapshot_archives"); diff --git a/core/tests/epoch_accounts_hash.rs b/core/tests/epoch_accounts_hash.rs index b53dd404b5dec6..5c7fc4be7e1c5f 100755 --- a/core/tests/epoch_accounts_hash.rs +++ b/core/tests/epoch_accounts_hash.rs @@ -1,5 +1,6 @@ #![allow(clippy::integer_arithmetic)] use { + crate::snapshot_utils::create_tmp_accounts_dir_for_tests, log::*, solana_core::{ accounts_hash_verifier::AccountsHashVerifier, @@ -442,9 +443,9 @@ fn test_snapshots_have_expected_epoch_accounts_hash() { std::thread::sleep(Duration::from_secs(1)); }; - let accounts_dir = TempDir::new().unwrap(); + let (_tmp_dir, accounts_dir) = create_tmp_accounts_dir_for_tests(); let deserialized_bank = snapshot_utils::bank_from_snapshot_archives( - &[accounts_dir.path().to_path_buf()], + &[accounts_dir.as_path().to_path_buf()], &snapshot_config.bank_snapshots_dir, &full_snapshot_archive_info, None, diff --git a/core/tests/snapshots.rs b/core/tests/snapshots.rs index d5cf8cf123e909..c8bb603fb44d4c 100644 --- a/core/tests/snapshots.rs +++ b/core/tests/snapshots.rs @@ -1,6 +1,7 @@ #![allow(clippy::integer_arithmetic)] use { + crate::snapshot_utils::create_tmp_accounts_dir_for_tests, bincode::serialize_into, crossbeam_channel::unbounded, fs_extra::dir::CopyOptions, @@ -74,7 +75,8 @@ struct SnapshotTestConfig { incremental_snapshot_archives_dir: TempDir, full_snapshot_archives_dir: TempDir, bank_snapshots_dir: TempDir, - accounts_dir: TempDir, + accounts_dir: PathBuf, + _accounts_tmp_dir: TempDir, } impl SnapshotTestConfig { @@ -85,7 +87,7 @@ impl SnapshotTestConfig { full_snapshot_archive_interval_slots: Slot, incremental_snapshot_archive_interval_slots: Slot, ) -> SnapshotTestConfig { - let accounts_dir = TempDir::new().unwrap(); + let (_accounts_tmp_dir, accounts_dir) = create_tmp_accounts_dir_for_tests(); let bank_snapshots_dir = TempDir::new().unwrap(); let full_snapshot_archives_dir = TempDir::new().unwrap(); let incremental_snapshot_archives_dir = TempDir::new().unwrap(); @@ -102,7 +104,7 @@ impl SnapshotTestConfig { let bank0 = Bank::new_with_paths_for_tests( &genesis_config_info.genesis_config, Arc::::default(), - vec![accounts_dir.path().to_path_buf()], + vec![accounts_dir.clone()], AccountSecondaryIndexes::default(), accounts_db::AccountShrinkThreshold::default(), ); @@ -131,6 +133,7 @@ impl SnapshotTestConfig { full_snapshot_archives_dir, bank_snapshots_dir, accounts_dir, + _accounts_tmp_dir, } } } @@ -296,8 +299,8 @@ fn run_bank_forks_snapshot_n( .unwrap(); // Restore bank from snapshot - let temporary_accounts_dir = TempDir::new().unwrap(); - let account_paths = &[temporary_accounts_dir.path().to_path_buf()]; + let (_tmp_dir, temporary_accounts_dir) = create_tmp_accounts_dir_for_tests(); + let account_paths = &[temporary_accounts_dir]; let genesis_config = &snapshot_test_config.genesis_config_info.genesis_config; restore_from_snapshot(bank_forks, last_slot, genesis_config, account_paths); @@ -726,7 +729,7 @@ fn test_bank_forks_incremental_snapshot( INCREMENTAL_SNAPSHOT_ARCHIVE_INTERVAL_SLOTS, ); trace!("SnapshotTestConfig:\naccounts_dir: {}\nbank_snapshots_dir: {}\nfull_snapshot_archives_dir: {}\nincremental_snapshot_archives_dir: {}", - snapshot_test_config.accounts_dir.path().display(), snapshot_test_config.bank_snapshots_dir.path().display(), snapshot_test_config.full_snapshot_archives_dir.path().display(), snapshot_test_config.incremental_snapshot_archives_dir.path().display()); + snapshot_test_config.accounts_dir.display(), snapshot_test_config.bank_snapshots_dir.path().display(), snapshot_test_config.full_snapshot_archives_dir.path().display(), snapshot_test_config.incremental_snapshot_archives_dir.path().display()); let bank_forks = &mut snapshot_test_config.bank_forks; let mint_keypair = &snapshot_test_config.genesis_config_info.mint_keypair; @@ -821,11 +824,11 @@ fn test_bank_forks_incremental_snapshot( // Accounts directory needs to be separate from the active accounts directory // so that dropping append vecs in the active accounts directory doesn't // delete the unpacked appendvecs in the snapshot - let temporary_accounts_dir = TempDir::new().unwrap(); + let (_tmp_dir, temporary_accounts_dir) = create_tmp_accounts_dir_for_tests(); restore_from_snapshots_and_check_banks_are_equal( &bank, &snapshot_test_config.snapshot_config, - temporary_accounts_dir.path().to_path_buf(), + temporary_accounts_dir, &snapshot_test_config.genesis_config_info.genesis_config, ) .unwrap(); @@ -1120,7 +1123,7 @@ fn test_snapshots_with_background_services( } // Load the snapshot and ensure it matches what's in BankForks - let temporary_accounts_dir = TempDir::new().unwrap(); + let (_tmp_dir, temporary_accounts_dir) = create_tmp_accounts_dir_for_tests(); let (deserialized_bank, ..) = snapshot_utils::bank_from_latest_snapshot_archives( &snapshot_test_config.snapshot_config.bank_snapshots_dir, &snapshot_test_config @@ -1129,7 +1132,7 @@ fn test_snapshots_with_background_services( &snapshot_test_config .snapshot_config .incremental_snapshot_archives_dir, - &[temporary_accounts_dir.as_ref().to_path_buf()], + &[temporary_accounts_dir], &snapshot_test_config.genesis_config_info.genesis_config, &RuntimeConfig::default(), None, diff --git a/ledger-tool/src/main.rs b/ledger-tool/src/main.rs index 84e469f8437f2b..78ecf386c9524e 100644 --- a/ledger-tool/src/main.rs +++ b/ledger-tool/src/main.rs @@ -62,8 +62,8 @@ use { snapshot_hash::StartingSnapshotHashes, snapshot_minimizer::SnapshotMinimizer, snapshot_utils::{ - self, move_and_async_delete_path, ArchiveFormat, SnapshotVersion, - DEFAULT_ARCHIVE_COMPRESSION, SUPPORTED_ARCHIVE_COMPRESSION, + self, create_accounts_run_and_snapshot_dirs, move_and_async_delete_path, ArchiveFormat, + SnapshotVersion, DEFAULT_ARCHIVE_COMPRESSION, SUPPORTED_ARCHIVE_COMPRESSION, }, }, solana_sdk::{ @@ -1092,6 +1092,22 @@ fn load_bank_forks( ); vec![non_primary_accounts_path] }; + + // For all account_paths, set up the run/ and snapshot/ sub directories. + let account_run_paths: Vec = account_paths.into_iter().map( + |account_path| { + match create_accounts_run_and_snapshot_dirs(&account_path) { + Ok((account_run_path, _account_snapshot_path)) => account_run_path, + Err(err) => { + eprintln!("Unable to create account run and snapshot sub directories: {}, err: {err:?}", account_path.display()); + exit(1); + } + } + }).collect(); + + // From now on, use run/ paths in the same way as the previous account_paths. + let account_paths = account_run_paths; + info!("Cleaning contents of account paths: {:?}", account_paths); let mut measure = Measure::start("clean_accounts_paths"); account_paths.iter().for_each(|path| { diff --git a/local-cluster/src/local_cluster.rs b/local-cluster/src/local_cluster.rs index cedf81f48c0d4f..1b759044c98139 100644 --- a/local-cluster/src/local_cluster.rs +++ b/local-cluster/src/local_cluster.rs @@ -22,6 +22,7 @@ use { ValidatorVoteKeypairs, }, snapshot_config::SnapshotConfig, + snapshot_utils::create_accounts_run_and_snapshot_dirs, }, solana_sdk::{ account::{Account, AccountSharedData}, @@ -147,7 +148,11 @@ impl LocalCluster { config: &mut ValidatorConfig, ledger_path: &Path, ) { - config.account_paths = vec![ledger_path.join("accounts")]; + config.account_paths = vec![ + create_accounts_run_and_snapshot_dirs(ledger_path.join("accounts")) + .unwrap() + .0, + ]; config.tower_storage = Arc::new(FileTowerStorage::new(ledger_path.to_path_buf())); let snapshot_config = &mut config.snapshot_config; diff --git a/local-cluster/tests/common.rs b/local-cluster/tests/common.rs index ba594af9f5fde5..c6618283161352 100644 --- a/local-cluster/tests/common.rs +++ b/local-cluster/tests/common.rs @@ -21,7 +21,9 @@ use { validator_configs::*, }, solana_rpc_client::rpc_client::RpcClient, - solana_runtime::snapshot_config::SnapshotConfig, + solana_runtime::{ + snapshot_config::SnapshotConfig, snapshot_utils::create_accounts_run_and_snapshot_dirs, + }, solana_sdk::{ account::AccountSharedData, clock::{self, Slot, DEFAULT_MS_PER_SLOT, DEFAULT_TICKS_PER_SLOT}, @@ -436,7 +438,7 @@ pub fn generate_account_paths(num_account_paths: usize) -> (Vec, Vec = account_storage_dirs .iter() - .map(|a| a.path().to_path_buf()) + .map(|a| create_accounts_run_and_snapshot_dirs(a.path()).unwrap().0) .collect(); (account_storage_dirs, account_storage_paths) } diff --git a/local-cluster/tests/local_cluster.rs b/local-cluster/tests/local_cluster.rs index c085a9566255bc..96dec5c8899aba 100644 --- a/local-cluster/tests/local_cluster.rs +++ b/local-cluster/tests/local_cluster.rs @@ -38,7 +38,9 @@ use { snapshot_archive_info::SnapshotArchiveInfoGetter, snapshot_config::SnapshotConfig, snapshot_package::SnapshotType, - snapshot_utils::{self, ArchiveFormat, SnapshotVersion}, + snapshot_utils::{ + self, create_accounts_run_and_snapshot_dirs, ArchiveFormat, SnapshotVersion, + }, }, solana_sdk::{ account::AccountSharedData, @@ -2152,7 +2154,11 @@ fn create_snapshot_to_hard_fork( let (bank_forks, ..) = bank_forks_utils::load( &genesis_config, blockstore, - vec![ledger_path.join("accounts")], + vec![ + create_accounts_run_and_snapshot_dirs(ledger_path.join("accounts")) + .unwrap() + .0, + ], None, snapshot_config.as_ref(), process_options, diff --git a/runtime/src/accounts_db.rs b/runtime/src/accounts_db.rs index 637511370b291f..04972ff2f62c1d 100644 --- a/runtime/src/accounts_db.rs +++ b/runtime/src/accounts_db.rs @@ -53,6 +53,7 @@ use { read_only_accounts_cache::ReadOnlyAccountsCache, rent_collector::RentCollector, rent_paying_accounts_by_partition::RentPayingAccountsByPartition, + snapshot_utils::create_accounts_run_and_snapshot_dirs, sorted_storages::SortedStorages, storable_accounts::StorableAccounts, verify_accounts_hash_in_background::VerifyAccountsHashInBackground, @@ -1113,7 +1114,14 @@ impl AccountStorageEntry { pub fn get_temp_accounts_paths(count: u32) -> IoResult<(Vec, Vec)> { let temp_dirs: IoResult> = (0..count).map(|_| TempDir::new()).collect(); let temp_dirs = temp_dirs?; - let paths: Vec = temp_dirs.iter().map(|t| t.path().to_path_buf()).collect(); + + let paths: IoResult> = temp_dirs + .iter() + .map(|temp_dir| { + create_accounts_run_and_snapshot_dirs(temp_dir).map(|(run_dir, _snapshot_dir)| run_dir) + }) + .collect(); + let paths = paths?; Ok((temp_dirs, paths)) } diff --git a/runtime/src/hardened_unpack.rs b/runtime/src/hardened_unpack.rs index 9c8e85ec1cedae..e016fa1cae957f 100644 --- a/runtime/src/hardened_unpack.rs +++ b/runtime/src/hardened_unpack.rs @@ -132,6 +132,8 @@ where } let parts: Vec<_> = parts.map(|p| p.unwrap()).collect(); + let account_filename = + (parts.len() == 2 && parts[0] == "accounts").then(|| PathBuf::from(parts[1])); let unpack_dir = match entry_checker(parts.as_slice(), kind) { UnpackPath::Invalid => { return Err(UnpackError::Archive(format!( @@ -175,8 +177,16 @@ where let entry_path_buf = unpack_dir.join(entry.path()?); set_perms(&entry_path_buf, mode)?; + let entry_path = if let Some(account_filename) = account_filename { + let stripped_path = unpack_dir.join(account_filename); // strip away "accounts" + fs::rename(&entry_path_buf, &stripped_path)?; + stripped_path + } else { + entry_path_buf + }; + // Process entry after setting permissions - entry_processor(entry_path_buf); + entry_processor(entry_path); total_entries += 1; let now = Instant::now(); diff --git a/runtime/src/serde_snapshot/tests.rs b/runtime/src/serde_snapshot/tests.rs index a7980ff857ada1..b87f8bcca60ef3 100644 --- a/runtime/src/serde_snapshot/tests.rs +++ b/runtime/src/serde_snapshot/tests.rs @@ -13,7 +13,9 @@ use { bank::{Bank, BankTestConfig}, epoch_accounts_hash, genesis_utils::{self, activate_all_features, activate_feature}, - snapshot_utils::{get_storages_to_serialize, ArchiveFormat}, + snapshot_utils::{ + create_tmp_accounts_dir_for_tests, get_storages_to_serialize, ArchiveFormat, + }, status_cache::StatusCache, }, bincode::serialize_into, @@ -575,7 +577,7 @@ fn test_extra_fields_full_snapshot_archive() { // Set extra field bank.fee_rate_governor.lamports_per_signature = 7000; - let accounts_dir = TempDir::new().unwrap(); + let (_tmp_dir, accounts_dir) = create_tmp_accounts_dir_for_tests(); let bank_snapshots_dir = TempDir::new().unwrap(); let full_snapshot_archives_dir = TempDir::new().unwrap(); let incremental_snapshot_archives_dir = TempDir::new().unwrap(); @@ -595,7 +597,7 @@ fn test_extra_fields_full_snapshot_archive() { // Deserialize let (dbank, _) = snapshot_utils::bank_from_snapshot_archives( - &[PathBuf::from(accounts_dir.path())], + &[accounts_dir], bank_snapshots_dir.path(), &snapshot_archive_info, None, diff --git a/runtime/src/snapshot_utils.rs b/runtime/src/snapshot_utils.rs index 4455536dbd3643..7515c7a6bca284 100644 --- a/runtime/src/snapshot_utils.rs +++ b/runtime/src/snapshot_utils.rs @@ -833,6 +833,21 @@ where Ok(()) } +/// To allow generating a bank snapshot directory with full state information, we need to +/// hardlink account appendvec files from the runtime operation directory to a snapshot +/// hardlink directory. This is to create the run/ and snapshot sub directories for an +/// account_path provided by the user. These two sub directories are on the same file +/// system partition to allow hard-linking. +pub fn create_accounts_run_and_snapshot_dirs( + account_dir: impl AsRef, +) -> std::io::Result<(PathBuf, PathBuf)> { + let run_path = account_dir.as_ref().join("run"); + let snapshot_path = account_dir.as_ref().join("snapshot"); + fs::create_dir_all(&run_path)?; + fs::create_dir_all(&snapshot_path)?; + Ok((run_path, snapshot_path)) +} + /// Serialize a bank to a snapshot /// /// **DEVELOPER NOTE** Any error that is returned from this function may bring down the node! This @@ -2123,10 +2138,11 @@ pub fn verify_snapshot_archive( { let temp_dir = tempfile::TempDir::new().unwrap(); let unpack_dir = temp_dir.path(); + let account_dir = create_accounts_run_and_snapshot_dirs(unpack_dir).unwrap().0; untar_snapshot_in( snapshot_archive, unpack_dir, - &[unpack_dir.to_path_buf()], + &[account_dir.clone()], archive_format, 1, ) @@ -2147,9 +2163,14 @@ pub fn verify_snapshot_archive( assert!(!dir_diff::is_different(&snapshots_to_verify, unpacked_snapshots).unwrap()); + // In the unarchiving case, there is an extra empty "accounts" directory. The account + // files in the archive accounts/ have been expanded to [account_paths]. + // Remove the empty "accounts" directory for the directory comparison below. + // In some test cases the directory to compare do not come from unarchiving. + // Ignore the error when this directory does not exist. + _ = std::fs::remove_dir(account_dir.join("accounts")); // Check the account entries are the same - let unpacked_accounts = unpack_dir.join("accounts"); - assert!(!dir_diff::is_different(&storages_to_verify, unpacked_accounts).unwrap()); + assert!(!dir_diff::is_different(&storages_to_verify, account_dir).unwrap()); } /// Remove outdated bank snapshots @@ -2406,6 +2427,12 @@ pub fn should_take_incremental_snapshot( && last_full_snapshot_slot.is_some() } +pub fn create_tmp_accounts_dir_for_tests() -> (TempDir, PathBuf) { + let tmp_dir = tempfile::TempDir::new().unwrap(); + let account_dir = create_accounts_run_and_snapshot_dirs(&tmp_dir).unwrap().0; + (tmp_dir, account_dir) +} + #[cfg(test)] mod tests { use { @@ -3324,7 +3351,7 @@ mod tests { original_bank.register_tick(&Hash::new_unique()); } - let accounts_dir = tempfile::TempDir::new().unwrap(); + let (_tmp_dir, accounts_dir) = create_tmp_accounts_dir_for_tests(); let bank_snapshots_dir = tempfile::TempDir::new().unwrap(); let full_snapshot_archives_dir = tempfile::TempDir::new().unwrap(); let incremental_snapshot_archives_dir = tempfile::TempDir::new().unwrap(); @@ -3343,7 +3370,7 @@ mod tests { .unwrap(); let (roundtrip_bank, _) = bank_from_snapshot_archives( - &[PathBuf::from(accounts_dir.path())], + &[accounts_dir], bank_snapshots_dir.path(), &snapshot_archive_info, None, @@ -3436,7 +3463,7 @@ mod tests { bank4.register_tick(&Hash::new_unique()); } - let accounts_dir = tempfile::TempDir::new().unwrap(); + let (_tmp_dir, accounts_dir) = create_tmp_accounts_dir_for_tests(); let bank_snapshots_dir = tempfile::TempDir::new().unwrap(); let full_snapshot_archives_dir = tempfile::TempDir::new().unwrap(); let incremental_snapshot_archives_dir = tempfile::TempDir::new().unwrap(); @@ -3455,7 +3482,7 @@ mod tests { .unwrap(); let (roundtrip_bank, _) = bank_from_snapshot_archives( - &[PathBuf::from(accounts_dir.path())], + &[accounts_dir], bank_snapshots_dir.path(), &full_snapshot_archive_info, None, @@ -3527,7 +3554,7 @@ mod tests { bank1.register_tick(&Hash::new_unique()); } - let accounts_dir = tempfile::TempDir::new().unwrap(); + let (_tmp_dir, accounts_dir) = create_tmp_accounts_dir_for_tests(); let bank_snapshots_dir = tempfile::TempDir::new().unwrap(); let full_snapshot_archives_dir = tempfile::TempDir::new().unwrap(); let incremental_snapshot_archives_dir = tempfile::TempDir::new().unwrap(); @@ -3587,7 +3614,7 @@ mod tests { .unwrap(); let (roundtrip_bank, _) = bank_from_snapshot_archives( - &[PathBuf::from(accounts_dir.path())], + &[accounts_dir], bank_snapshots_dir.path(), &full_snapshot_archive_info, Some(&incremental_snapshot_archive_info), @@ -3649,7 +3676,7 @@ mod tests { bank1.register_tick(&Hash::new_unique()); } - let accounts_dir = tempfile::TempDir::new().unwrap(); + let (_tmp_dir, accounts_dir) = create_tmp_accounts_dir_for_tests(); let bank_snapshots_dir = tempfile::TempDir::new().unwrap(); let full_snapshot_archives_dir = tempfile::TempDir::new().unwrap(); let incremental_snapshot_archives_dir = tempfile::TempDir::new().unwrap(); @@ -3712,7 +3739,7 @@ mod tests { &bank_snapshots_dir, &full_snapshot_archives_dir, &incremental_snapshot_archives_dir, - &[accounts_dir.as_ref().to_path_buf()], + &[accounts_dir], &genesis_config, &RuntimeConfig::default(), None, @@ -3762,7 +3789,7 @@ mod tests { let key1 = Keypair::new(); let key2 = Keypair::new(); - let accounts_dir = tempfile::TempDir::new().unwrap(); + let (_tmp_dir, accounts_dir) = create_tmp_accounts_dir_for_tests(); let bank_snapshots_dir = tempfile::TempDir::new().unwrap(); let full_snapshot_archives_dir = tempfile::TempDir::new().unwrap(); let incremental_snapshot_archives_dir = tempfile::TempDir::new().unwrap(); @@ -3774,7 +3801,7 @@ mod tests { let bank0 = Arc::new(Bank::new_with_paths_for_tests( &genesis_config, Arc::::default(), - vec![accounts_dir.path().to_path_buf()], + vec![accounts_dir.clone()], AccountSecondaryIndexes::default(), AccountShrinkThreshold::default(), )); @@ -3848,7 +3875,7 @@ mod tests { ) .unwrap(); let (deserialized_bank, _) = bank_from_snapshot_archives( - &[accounts_dir.path().to_path_buf()], + &[accounts_dir.as_path().to_path_buf()], bank_snapshots_dir.path(), &full_snapshot_archive_info, Some(&incremental_snapshot_archive_info), @@ -3912,7 +3939,7 @@ mod tests { .unwrap(); let (deserialized_bank, _) = bank_from_snapshot_archives( - &[accounts_dir.path().to_path_buf()], + &[accounts_dir.as_path().to_path_buf()], bank_snapshots_dir.path(), &full_snapshot_archive_info, Some(&incremental_snapshot_archive_info), diff --git a/test-validator/src/lib.rs b/test-validator/src/lib.rs index d7016cff0fe9cd..7d28fce8cd0c00 100644 --- a/test-validator/src/lib.rs +++ b/test-validator/src/lib.rs @@ -25,7 +25,7 @@ use { accounts_db::AccountsDbConfig, accounts_index::AccountsIndexConfig, bank_forks::BankForks, genesis_utils::create_genesis_config_with_leader_ex, hardened_unpack::MAX_GENESIS_ARCHIVE_UNPACKED_SIZE, runtime_config::RuntimeConfig, - snapshot_config::SnapshotConfig, + snapshot_config::SnapshotConfig, snapshot_utils::create_accounts_run_and_snapshot_dirs, }, solana_sdk::{ account::{Account, AccountSharedData}, @@ -802,7 +802,11 @@ impl TestValidator { rpc_config: config.rpc_config.clone(), pubsub_config: config.pubsub_config.clone(), accounts_hash_interval_slots: 100, - account_paths: vec![ledger_path.join("accounts")], + account_paths: vec![ + create_accounts_run_and_snapshot_dirs(ledger_path.join("accounts")) + .unwrap() + .0, + ], poh_verify: false, // Skip PoH verification of ledger on startup for speed snapshot_config: SnapshotConfig { full_snapshot_archive_interval_slots: 100, diff --git a/validator/src/main.rs b/validator/src/main.rs index 0035bfc4d14240..67f39206a871e8 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -34,7 +34,9 @@ use { }, runtime_config::RuntimeConfig, snapshot_config::{SnapshotConfig, SnapshotUsage}, - snapshot_utils::{self, ArchiveFormat, SnapshotVersion}, + snapshot_utils::{ + self, create_accounts_run_and_snapshot_dirs, ArchiveFormat, SnapshotVersion, + }, }, solana_sdk::{ clock::{Slot, DEFAULT_S_PER_SLOT}, @@ -1251,7 +1253,7 @@ pub fn main() { .ok(); // Create and canonicalize account paths to avoid issues with symlink creation - validator_config.account_paths = account_paths + let account_run_paths: Vec = account_paths .into_iter() .map(|account_path| { match fs::create_dir_all(&account_path).and_then(|_| fs::canonicalize(&account_path)) { @@ -1261,8 +1263,20 @@ pub fn main() { exit(1); } } - }) - .collect(); + }).map( + |account_path| { + // For all account_paths, set up the run/ and snapshot/ sub directories. + match create_accounts_run_and_snapshot_dirs(&account_path) { + Ok((account_run_path, _account_snapshot_path)) => account_run_path, + Err(err) => { + eprintln!("Unable to create account run and snapshot sub directories: {}, err: {err:?}", account_path.display()); + exit(1); + } + } + }).collect(); + + // From now on, use run/ paths in the same way as the previous account_paths. + validator_config.account_paths = account_run_paths; validator_config.account_shrink_paths = account_shrink_paths.map(|paths| { paths