Generate a snapshot at synchronized points (#8532)
Co-authored-by: anatoly yakovenko <anatoly@solana.com>
This commit is contained in:
@ -177,26 +177,38 @@ impl BankForks {
|
|||||||
.last()
|
.last()
|
||||||
.map(|bank| bank.transaction_count())
|
.map(|bank| bank.transaction_count())
|
||||||
.unwrap_or(0);
|
.unwrap_or(0);
|
||||||
|
// Generate each snapshot at a fixed interval
|
||||||
root_bank.squash();
|
let mut is_root_bank_squashed = false;
|
||||||
let new_tx_count = root_bank.transaction_count();
|
|
||||||
|
|
||||||
// Generate a snapshot if snapshots are configured and it's been an appropriate number
|
|
||||||
// of banks since the last snapshot
|
|
||||||
if self.snapshot_config.is_some() && snapshot_package_sender.is_some() {
|
if self.snapshot_config.is_some() && snapshot_package_sender.is_some() {
|
||||||
let config = self.snapshot_config.as_ref().unwrap();
|
let config = self.snapshot_config.as_ref().unwrap();
|
||||||
info!("setting snapshot root: {}", root);
|
let mut banks = vec![root_bank];
|
||||||
if root - self.last_snapshot_slot >= config.snapshot_interval_slots as Slot {
|
let parents = root_bank.parents();
|
||||||
|
banks.extend(parents.iter());
|
||||||
|
for bank in banks.iter() {
|
||||||
|
let bank_slot = bank.slot();
|
||||||
|
if bank.block_height() % (config.snapshot_interval_slots as u64) == 0 {
|
||||||
|
// Generate a snapshot if snapshots are configured and it's been an appropriate number
|
||||||
|
// of banks since the last snapshot
|
||||||
|
info!(
|
||||||
|
"setting snapshot root: {} interval: {}",
|
||||||
|
bank_slot, config.snapshot_interval_slots
|
||||||
|
);
|
||||||
|
if bank_slot > self.last_snapshot_slot {
|
||||||
|
bank.squash();
|
||||||
|
is_root_bank_squashed = bank_slot == root;
|
||||||
let mut snapshot_time = Measure::start("total-snapshot-ms");
|
let mut snapshot_time = Measure::start("total-snapshot-ms");
|
||||||
let r = self.generate_snapshot(
|
let r = self.generate_snapshot(
|
||||||
root,
|
bank_slot,
|
||||||
&root_bank.src.roots(),
|
&bank.src.roots(),
|
||||||
snapshot_package_sender.as_ref().unwrap(),
|
snapshot_package_sender.as_ref().unwrap(),
|
||||||
);
|
);
|
||||||
if r.is_err() {
|
if r.is_err() {
|
||||||
warn!("Error generating snapshot for bank: {}, err: {:?}", root, r);
|
warn!(
|
||||||
|
"Error generating snapshot for bank: {}, err: {:?}",
|
||||||
|
bank_slot, r
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
self.last_snapshot_slot = root;
|
self.last_snapshot_slot = bank_slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup outdated snapshots
|
// Cleanup outdated snapshots
|
||||||
@ -204,7 +216,14 @@ impl BankForks {
|
|||||||
snapshot_time.stop();
|
snapshot_time.stop();
|
||||||
inc_new_counter_info!("total-snapshot-ms", snapshot_time.as_ms() as usize);
|
inc_new_counter_info!("total-snapshot-ms", snapshot_time.as_ms() as usize);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !is_root_bank_squashed {
|
||||||
|
root_bank.squash();
|
||||||
|
}
|
||||||
|
let new_tx_count = root_bank.transaction_count();
|
||||||
|
|
||||||
self.prune_non_root(root);
|
self.prune_non_root(root);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user