Ledger processing speed tracking (#9005)

This commit is contained in:
sakridge 2020-03-23 12:19:11 -07:00 committed by GitHub
parent c530fbd22b
commit d75a470ffa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 22 additions and 10 deletions

View File

@ -453,18 +453,17 @@ pub fn verify_ticks(
fn confirm_full_slot( fn confirm_full_slot(
blockstore: &Blockstore, blockstore: &Blockstore,
bank: &Arc<Bank>, bank: &Arc<Bank>,
last_entry_hash: &Hash,
opts: &ProcessOptions, opts: &ProcessOptions,
recyclers: &VerifyRecyclers, recyclers: &VerifyRecyclers,
progress: &mut ConfirmationProgress,
) -> result::Result<(), BlockstoreProcessorError> { ) -> result::Result<(), BlockstoreProcessorError> {
let mut timing = ConfirmationTiming::default(); let mut timing = ConfirmationTiming::default();
let mut progress = ConfirmationProgress::new(*last_entry_hash);
let skip_verification = !opts.poh_verify; let skip_verification = !opts.poh_verify;
confirm_slot( confirm_slot(
blockstore, blockstore,
bank, bank,
&mut timing, &mut timing,
&mut progress, progress,
skip_verification, skip_verification,
None, None,
opts.entry_callback.as_ref(), opts.entry_callback.as_ref(),
@ -625,7 +624,8 @@ fn process_bank_0(
recyclers: &VerifyRecyclers, recyclers: &VerifyRecyclers,
) -> result::Result<(), BlockstoreProcessorError> { ) -> result::Result<(), BlockstoreProcessorError> {
assert_eq!(bank0.slot(), 0); assert_eq!(bank0.slot(), 0);
confirm_full_slot(blockstore, bank0, &bank0.last_blockhash(), opts, recyclers) let mut progress = ConfirmationProgress::new(bank0.last_blockhash());
confirm_full_slot(blockstore, bank0, opts, recyclers, &mut progress)
.expect("processing for bank 0 must succceed"); .expect("processing for bank 0 must succceed");
bank0.freeze(); bank0.freeze();
Ok(()) Ok(())
@ -706,6 +706,8 @@ fn process_pending_slots(
let mut last_status_report = Instant::now(); let mut last_status_report = Instant::now();
let mut pending_slots = vec![]; let mut pending_slots = vec![];
let mut last_root_slot = root_bank.slot(); let mut last_root_slot = root_bank.slot();
let mut slots_elapsed = 0;
let mut txs = 0;
process_next_slots( process_next_slots(
root_bank, root_bank,
root_meta, root_meta,
@ -720,19 +722,28 @@ fn process_pending_slots(
let (meta, bank, last_entry_hash) = pending_slots.pop().unwrap(); let (meta, bank, last_entry_hash) = pending_slots.pop().unwrap();
let slot = bank.slot(); let slot = bank.slot();
if last_status_report.elapsed() > Duration::from_secs(2) { if last_status_report.elapsed() > Duration::from_secs(2) {
let secs = last_status_report.elapsed().as_secs() as f32;
info!( info!(
"processing ledger: slot={}, last root slot={}", "processing ledger: slot={}, last root slot={} slots={} slots/s={:?} txs/s={}",
slot, last_root_slot slot,
last_root_slot,
slots_elapsed,
slots_elapsed as f32 / secs,
txs as f32 / secs,
); );
last_status_report = Instant::now(); last_status_report = Instant::now();
slots_elapsed = 0;
txs = 0;
} }
let allocated = thread_mem_usage::Allocatedp::default(); let allocated = thread_mem_usage::Allocatedp::default();
let initial_allocation = allocated.get(); let initial_allocation = allocated.get();
if process_single_slot(blockstore, &bank, &last_entry_hash, opts, recyclers).is_err() { let mut progress = ConfirmationProgress::new(last_entry_hash);
if process_single_slot(blockstore, &bank, opts, recyclers, &mut progress).is_err() {
continue; continue;
} }
txs += progress.num_txs;
if blockstore.is_root(slot) { if blockstore.is_root(slot) {
let parents = bank.parents().into_iter().map(|b| b.slot()).rev().skip(1); let parents = bank.parents().into_iter().map(|b| b.slot()).rev().skip(1);
@ -745,6 +756,7 @@ fn process_pending_slots(
fork_info.clear(); fork_info.clear();
last_root_slot = slot; last_root_slot = slot;
} }
slots_elapsed += 1;
trace!( trace!(
"Bank for {}slot {} is complete. {} bytes allocated", "Bank for {}slot {} is complete. {} bytes allocated",
@ -775,13 +787,13 @@ fn process_pending_slots(
fn process_single_slot( fn process_single_slot(
blockstore: &Blockstore, blockstore: &Blockstore,
bank: &Arc<Bank>, bank: &Arc<Bank>,
last_entry_hash: &Hash,
opts: &ProcessOptions, opts: &ProcessOptions,
recyclers: &VerifyRecyclers, recyclers: &VerifyRecyclers,
progress: &mut ConfirmationProgress,
) -> result::Result<(), BlockstoreProcessorError> { ) -> result::Result<(), BlockstoreProcessorError> {
// Mark corrupt slots as dead so validators don't replay this slot and // Mark corrupt slots as dead so validators don't replay this slot and
// see DuplicateSignature errors later in ReplayStage // see DuplicateSignature errors later in ReplayStage
confirm_full_slot(blockstore, bank, last_entry_hash, opts, recyclers).map_err(|err| { confirm_full_slot(blockstore, bank, opts, recyclers, progress).map_err(|err| {
let slot = bank.slot(); let slot = bank.slot();
blockstore blockstore
.set_dead_slot(slot) .set_dead_slot(slot)
@ -2441,9 +2453,9 @@ pub mod tests {
confirm_full_slot( confirm_full_slot(
&blockstore, &blockstore,
&bank1, &bank1,
&bank0.last_blockhash(),
&opts, &opts,
&recyclers, &recyclers,
&mut ConfirmationProgress::new(bank0.last_blockhash()),
) )
.unwrap(); .unwrap();
bank1.squash(); bank1.squash();