Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 0d4cb25

Browse files
committed
Adapt local-cluster/
1 parent fcabc6f commit 0d4cb25

File tree

6 files changed

+99
-84
lines changed

6 files changed

+99
-84
lines changed

core/tests/bank_forks.rs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -67,21 +67,30 @@ mod tests {
6767
}
6868
}
6969

70-
fn restore_from_snapshot(old_bank_forks: &BankForks, account_paths: Vec<PathBuf>) {
70+
fn restore_from_snapshot(
71+
old_bank_forks: &BankForks,
72+
old_last_slot: Slot,
73+
account_paths: Vec<PathBuf>,
74+
) {
7175
let (snapshot_path, snapshot_package_output_path) = old_bank_forks
7276
.snapshot_config
7377
.as_ref()
7478
.map(|c| (&c.snapshot_path, &c.snapshot_package_output_path))
7579
.unwrap();
7680

81+
let old_last_bank = old_bank_forks.get(old_last_slot).unwrap();
82+
7783
let deserialized_bank = snapshot_utils::bank_from_archive(
7884
&account_paths,
7985
&old_bank_forks
8086
.snapshot_config
8187
.as_ref()
8288
.unwrap()
8389
.snapshot_path,
84-
snapshot_utils::get_snapshot_archive_path(snapshot_package_output_path),
90+
snapshot_utils::get_snapshot_archive_path(
91+
snapshot_package_output_path,
92+
&(old_last_bank.slot(), old_last_bank.get_accounts_hash()),
93+
),
8594
)
8695
.unwrap();
8796

@@ -139,18 +148,20 @@ mod tests {
139148
slot_snapshot_paths
140149
.last()
141150
.expect("no snapshots found in path"),
142-
snapshot_utils::get_snapshot_archive_path(
143-
&snapshot_config.snapshot_package_output_path,
144-
),
145151
&snapshot_config.snapshot_path,
146152
&last_bank.src.roots(),
153+
&snapshot_config.snapshot_package_output_path,
147154
storages,
148155
)
149156
.unwrap();
150157

151158
snapshot_utils::archive_snapshot_package(&snapshot_package).unwrap();
152159

153-
restore_from_snapshot(bank_forks, vec![accounts_dir.path().to_path_buf()]);
160+
restore_from_snapshot(
161+
bank_forks,
162+
last_slot,
163+
vec![accounts_dir.path().to_path_buf()],
164+
);
154165
}
155166

156167
#[test]
@@ -249,14 +260,7 @@ mod tests {
249260
};
250261

251262
bank_forks
252-
.generate_snapshot(
253-
slot,
254-
&vec![],
255-
&package_sender,
256-
snapshot_config
257-
.snapshot_package_output_path
258-
.join(slot.to_string()),
259-
)
263+
.generate_snapshot(slot, &vec![], &package_sender)
260264
.unwrap();
261265

262266
if slot == saved_slot as u64 {

ledger-tool/src/main.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -915,12 +915,9 @@ fn main() {
915915
snapshot_utils::package_snapshot(
916916
&bank,
917917
&slot_snapshot_paths,
918-
snapshot_utils::get_snapshot_archive_path(
919-
output_directory,
920-
&(bank.slot(), bank.hash()),
921-
),
922918
&temp_dir,
923919
&bank.src.roots(),
920+
output_directory,
924921
storages,
925922
)
926923
})

ledger/src/bank_forks.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use solana_sdk::{clock::Slot, timing};
1010
use std::{
1111
collections::{HashMap, HashSet},
1212
ops::Index,
13-
path::{Path, PathBuf},
13+
path::PathBuf,
1414
sync::Arc,
1515
time::Instant,
1616
};
@@ -192,10 +192,6 @@ impl BankForks {
192192
root,
193193
&root_bank.src.roots(),
194194
snapshot_package_sender.as_ref().unwrap(),
195-
snapshot_utils::get_snapshot_archive_path(
196-
&config.snapshot_package_output_path,
197-
&(root_bank.slot(), root_bank.hash()),
198-
),
199195
);
200196
if r.is_err() {
201197
warn!("Error generating snapshot for bank: {}, err: {:?}", root, r);
@@ -239,12 +235,11 @@ impl BankForks {
239235
}
240236
}
241237

242-
pub fn generate_snapshot<P: AsRef<Path>>(
238+
pub fn generate_snapshot(
243239
&self,
244240
root: Slot,
245241
slots_to_snapshot: &[Slot],
246242
snapshot_package_sender: &SnapshotPackageSender,
247-
tar_output_file: P,
248243
) -> Result<()> {
249244
let config = self.snapshot_config.as_ref().unwrap();
250245

@@ -270,9 +265,9 @@ impl BankForks {
270265
let package = snapshot_utils::package_snapshot(
271266
&bank,
272267
latest_slot_snapshot_paths,
273-
tar_output_file,
274268
&config.snapshot_path,
275269
slots_to_snapshot,
270+
&config.snapshot_package_output_path,
276271
storages,
277272
)?;
278273

ledger/src/bank_forks_utils.rs

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::{
1010
};
1111
use log::*;
1212
use solana_sdk::{clock::Slot, genesis_config::GenesisConfig, hash::Hash};
13-
use std::{fs, path::PathBuf, result, sync::Arc};
13+
use std::{fs, path::PathBuf, process, result, sync::Arc};
1414

1515
pub type LoadResult = result::Result<
1616
(
@@ -55,39 +55,45 @@ pub fn load(
5555
match snapshot_utils::get_highest_snapshot_archive_path(
5656
&snapshot_config.snapshot_package_output_path,
5757
) {
58-
Some(tar) => {
59-
if tar.exists() {
60-
info!("Loading snapshot package: {:?}", tar);
61-
// Fail hard here if snapshot fails to load, don't silently continue
58+
Some((archive_filename, archive_snapshot_hash)) => {
59+
info!("Loading snapshot package: {:?}", archive_filename);
60+
// Fail hard here if snapshot fails to load, don't silently continue
6261

63-
if account_paths.is_empty() {
64-
panic!("Account paths not present when booting from snapshot")
65-
}
62+
if account_paths.is_empty() {
63+
error!("Account paths not present when booting from snapshot");
64+
process::exit(1);
65+
}
6666

67-
let deserialized_bank = snapshot_utils::bank_from_archive(
68-
&account_paths,
69-
&snapshot_config.snapshot_path,
70-
&tar,
71-
)
72-
.expect("Load from snapshot failed");
67+
let deserialized_bank = snapshot_utils::bank_from_archive(
68+
&account_paths,
69+
&snapshot_config.snapshot_path,
70+
&archive_filename,
71+
)
72+
.expect("Load from snapshot failed");
7373

74-
let snapshot_hash = (
75-
deserialized_bank.slot(),
76-
deserialized_bank.get_accounts_hash(),
77-
);
78-
return to_loadresult(
79-
blockstore_processor::process_blockstore_from_root(
80-
genesis_config,
81-
blockstore,
82-
Arc::new(deserialized_bank),
83-
&process_options,
84-
&VerifyRecyclers::default(),
85-
),
86-
Some(snapshot_hash),
74+
let deserialized_snapshot_hash = (
75+
deserialized_bank.slot(),
76+
deserialized_bank.get_accounts_hash(),
77+
);
78+
79+
if deserialized_snapshot_hash != archive_snapshot_hash {
80+
error!(
81+
"Snapshot has mismatch:\narchive: {:?}\ndeserialized: {:?}",
82+
archive_snapshot_hash, deserialized_snapshot_hash
8783
);
88-
} else {
89-
info!("Snapshot package does not exist: {:?}", tar);
84+
process::exit(1);
9085
}
86+
87+
return to_loadresult(
88+
blockstore_processor::process_blockstore_from_root(
89+
genesis_config,
90+
blockstore,
91+
Arc::new(deserialized_bank),
92+
&process_options,
93+
&VerifyRecyclers::default(),
94+
),
95+
Some(deserialized_snapshot_hash),
96+
);
9197
}
9298
None => info!("No snapshot package available"),
9399
}

ledger/src/snapshot_utils.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ impl SlotSnapshotPaths {
8282
pub fn package_snapshot<P: AsRef<Path>, Q: AsRef<Path>>(
8383
bank: &Bank,
8484
snapshot_files: &SlotSnapshotPaths,
85-
snapshot_package_output_file: P,
8685
snapshot_path: Q,
8786
slots_to_snapshot: &[Slot],
87+
snapshot_package_output_path: P,
8888
snapshot_storages: SnapshotStorages,
8989
) -> Result<SnapshotPackage> {
9090
// Hard link all the snapshots we need for this package
@@ -101,12 +101,17 @@ pub fn package_snapshot<P: AsRef<Path>, Q: AsRef<Path>>(
101101
// any temporary state created for the SnapshotPackage (like the snapshot_hard_links_dir)
102102
snapshot_files.copy_snapshot_directory(snapshot_hard_links_dir.path())?;
103103

104+
let snapshot_package_output_file = get_snapshot_archive_path(
105+
&snapshot_package_output_path,
106+
&(bank.slot(), bank.get_accounts_hash()),
107+
);
108+
104109
let package = SnapshotPackage::new(
105110
bank.slot(),
106111
bank.src.slot_deltas(slots_to_snapshot),
107112
snapshot_hard_links_dir,
108113
snapshot_storages,
109-
snapshot_package_output_file.as_ref().to_path_buf(),
114+
snapshot_package_output_file,
110115
bank.get_accounts_hash(),
111116
);
112117

@@ -555,9 +560,9 @@ fn get_snapshot_archives<P: AsRef<Path>>(snapshot_output_dir: P) -> Vec<(PathBuf
555560

556561
pub fn get_highest_snapshot_archive_path<P: AsRef<Path>>(
557562
snapshot_output_dir: P,
558-
) -> Option<PathBuf> {
563+
) -> Option<(PathBuf, (Slot, Hash))> {
559564
let archives = get_snapshot_archives(snapshot_output_dir);
560-
archives.into_iter().next().map(|archive| archive.0)
565+
archives.into_iter().next()
561566
}
562567

563568
pub fn untar_snapshot_in<P: AsRef<Path>, Q: AsRef<Path>>(

local-cluster/tests/local_cluster.rs

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ use solana_local_cluster::{
1818
};
1919
use solana_sdk::{
2020
client::SyncClient,
21-
clock,
21+
clock::{self, Slot},
2222
commitment_config::CommitmentConfig,
2323
epoch_schedule::{EpochSchedule, MINIMUM_SLOTS_PER_EPOCH},
2424
genesis_config::OperatingMode,
25+
hash::Hash,
2526
poh_config::PohConfig,
2627
signature::{Keypair, Signer},
2728
};
@@ -648,14 +649,16 @@ fn test_snapshot_restart_tower() {
648649
.as_ref()
649650
.unwrap()
650651
.snapshot_package_output_path;
651-
let tar = snapshot_utils::get_snapshot_archive_path(&snapshot_package_output_path);
652-
wait_for_next_snapshot(&cluster, &tar);
653652

654-
// Copy tar to validator's snapshot output directory
655-
let validator_tar_path = snapshot_utils::get_snapshot_archive_path(
653+
let (archive_filename, archive_snapshot_hash) =
654+
wait_for_next_snapshot(&cluster, &snapshot_package_output_path);
655+
656+
// Copy archive to validator's snapshot output directory
657+
let validator_archive_path = snapshot_utils::get_snapshot_archive_path(
656658
&validator_snapshot_test_config.snapshot_output_path,
659+
&archive_snapshot_hash,
657660
);
658-
fs::hard_link(tar, &validator_tar_path).unwrap();
661+
fs::hard_link(archive_filename, &validator_archive_path).unwrap();
659662

660663
// Restart validator from snapshot, the validator's tower state in this snapshot
661664
// will contain slots < the root bank of the snapshot. Validator should not panic.
@@ -704,21 +707,23 @@ fn test_snapshots_blockstore_floor() {
704707

705708
trace!("Waiting for snapshot tar to be generated with slot",);
706709

707-
let tar = snapshot_utils::get_snapshot_archive_path(&snapshot_package_output_path);
708-
loop {
709-
if tar.exists() {
710-
trace!("snapshot tar exists");
711-
break;
710+
let (archive_filename, (archive_slot, archive_hash)) = loop {
711+
let archive =
712+
snapshot_utils::get_highest_snapshot_archive_path(&snapshot_package_output_path);
713+
if archive.is_some() {
714+
trace!("snapshot exists");
715+
break archive.unwrap();
712716
}
713717
sleep(Duration::from_millis(5000));
714-
}
718+
};
715719

716-
// Copy tar to validator's snapshot output directory
717-
let validator_tar_path = snapshot_utils::get_snapshot_archive_path(
720+
// Copy archive to validator's snapshot output directory
721+
let validator_archive_path = snapshot_utils::get_snapshot_archive_path(
718722
&validator_snapshot_test_config.snapshot_output_path,
723+
&(archive_slot, archive_hash),
719724
);
720-
fs::hard_link(tar, &validator_tar_path).unwrap();
721-
let slot_floor = snapshot_utils::bank_slot_from_archive(&validator_tar_path).unwrap();
725+
fs::hard_link(archive_filename, &validator_archive_path).unwrap();
726+
let slot_floor = archive_slot;
722727

723728
// Start up a new node from a snapshot
724729
let validator_stake = 5;
@@ -814,8 +819,7 @@ fn test_snapshots_restart_validity() {
814819

815820
expected_balances.extend(new_balances);
816821

817-
let tar = snapshot_utils::get_snapshot_archive_path(&snapshot_package_output_path);
818-
wait_for_next_snapshot(&cluster, &tar);
822+
wait_for_next_snapshot(&cluster, &snapshot_package_output_path);
819823

820824
// Create new account paths since validator exit is not guaranteed to cleanup RPC threads,
821825
// which may delete the old accounts on exit at any point
@@ -952,7 +956,10 @@ fn test_no_voting() {
952956
}
953957
}
954958

955-
fn wait_for_next_snapshot<P: AsRef<Path>>(cluster: &LocalCluster, tar: P) {
959+
fn wait_for_next_snapshot(
960+
cluster: &LocalCluster,
961+
snapshot_package_output_path: &Path,
962+
) -> (PathBuf, (Slot, Hash)) {
956963
// Get slot after which this was generated
957964
let client = cluster
958965
.get_validator_client(&cluster.entry_point_info.id)
@@ -964,17 +971,18 @@ fn wait_for_next_snapshot<P: AsRef<Path>>(cluster: &LocalCluster, tar: P) {
964971
// Wait for a snapshot for a bank >= last_slot to be made so we know that the snapshot
965972
// must include the transactions just pushed
966973
trace!(
967-
"Waiting for snapshot tar to be generated with slot > {}",
974+
"Waiting for snapshot archive to be generated with slot > {}",
968975
last_slot
969976
);
970977
loop {
971-
if tar.as_ref().exists() {
972-
trace!("snapshot tar exists");
973-
let slot = snapshot_utils::bank_slot_from_archive(&tar).unwrap();
978+
if let Some((filename, (slot, hash))) =
979+
snapshot_utils::get_highest_snapshot_archive_path(snapshot_package_output_path)
980+
{
981+
trace!("snapshot for slot {} exists", slot);
974982
if slot >= last_slot {
975-
break;
983+
return (filename, (slot, hash));
976984
}
977-
trace!("snapshot tar slot {} < last_slot {}", slot, last_slot);
985+
trace!("snapshot slot {} < last_slot {}", slot, last_slot);
978986
}
979987
sleep(Duration::from_millis(5000));
980988
}

0 commit comments

Comments
 (0)