Generate a snapshot at synchronized points (#8532)

Co-authored-by: anatoly yakovenko <anatoly@solana.com>
This commit is contained in:
sakridge
2020-03-04 19:23:40 -08:00
committed by GitHub
parent b321da00b4
commit 23d8c7ff0e

View File

@ -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);