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
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 42 additions and 23 deletions

View File

@ -177,26 +177,38 @@ impl BankForks {
.last()
.map(|bank| bank.transaction_count())
.unwrap_or(0);
root_bank.squash();
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
// Generate each snapshot at a fixed interval
let mut is_root_bank_squashed = false;
if self.snapshot_config.is_some() && snapshot_package_sender.is_some() {
let config = self.snapshot_config.as_ref().unwrap();
info!("setting snapshot root: {}", root);
if root - self.last_snapshot_slot >= config.snapshot_interval_slots as Slot {
let mut banks = vec![root_bank];
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 r = self.generate_snapshot(
root,
&root_bank.src.roots(),
bank_slot,
&bank.src.roots(),
snapshot_package_sender.as_ref().unwrap(),
);
if r.is_err() {
warn!("Error generating snapshot for bank: {}, err: {:?}", root, r);
warn!(
"Error generating snapshot for bank: {}, err: {:?}",
bank_slot, r
);
} else {
self.last_snapshot_slot = root;
self.last_snapshot_slot = bank_slot;
}
// Cleanup outdated snapshots
@ -204,7 +216,14 @@ impl BankForks {
snapshot_time.stop();
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);