From 5e6c58716e2101eb06a8511a31b794bd22543dc6 Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Thu, 19 Dec 2019 09:48:10 -0700 Subject: [PATCH] Speed up show-block-production command --- cli/src/cluster_query.rs | 79 +++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 34 deletions(-) diff --git a/cli/src/cluster_query.rs b/cli/src/cluster_query.rs index f09103845..f6cc4049b 100644 --- a/cli/src/cluster_query.rs +++ b/cli/src/cluster_query.rs @@ -450,14 +450,6 @@ pub fn process_show_block_production( progress_bar.set_message("Connecting..."); progress_bar.set_message(&format!("Fetching leader schedule for epoch {}...", epoch)); - let leader_schedule = rpc_client - .get_leader_schedule_with_commitment(Some(start_slot), CommitmentConfig::max())?; - - if leader_schedule.is_none() { - return Err(format!("Unable to fetch leader schedule for slot {}", start_slot).into()); - } - let leader_schedule = leader_schedule.unwrap(); - progress_bar.set_message(&format!( "Fetching confirmed blocks between slots {} and {}...", start_slot, end_slot @@ -466,37 +458,53 @@ pub fn process_show_block_production( let total_slots = (end_slot - start_slot + 1) as usize; let total_blocks = confirmed_blocks.len(); + assert!(total_blocks <= total_slots); let total_slots_missed = total_slots - total_blocks; let mut leader_slot_count = HashMap::new(); let mut leader_missed_slots = HashMap::new(); - for slot_index in 0..total_slots { - let leader = { - let mut leader = None; - for (pubkey, leader_slots) in leader_schedule.iter() { - if leader_slots.contains(&slot_index) { - leader = Some(pubkey); + let leader_schedule = rpc_client + .get_leader_schedule_with_commitment(Some(start_slot), CommitmentConfig::max())?; + if leader_schedule.is_none() { + return Err(format!("Unable to fetch leader schedule for slot {}", start_slot).into()); + } + let leader_schedule = leader_schedule.unwrap(); + + let mut leader_per_slot_index = Vec::new(); + leader_per_slot_index.resize(total_slots, ""); + for (pubkey, leader_slots) in leader_schedule.iter() { + for slot_index in leader_slots.iter() { + if *slot_index < total_slots { + leader_per_slot_index[*slot_index] = pubkey; + } + } + } + + progress_bar.set_message(&format!( + "Processing {} slots containing {} blocks and {} empty slots...", + total_slots, total_blocks, total_slots_missed + )); + + let mut confirmed_blocks_index = 0; + for (slot_index, leader) in leader_per_slot_index.iter().enumerate().take(total_slots) { + let slot = start_slot + slot_index as u64; + let slot_count = leader_slot_count.entry(leader).or_insert(0); + *slot_count += 1; + let missed_slots = leader_missed_slots.entry(leader).or_insert(0); + + loop { + if !confirmed_blocks.is_empty() { + let slot_of_next_confirmed_block = confirmed_blocks[confirmed_blocks_index]; + if slot_of_next_confirmed_block < slot { + confirmed_blocks_index += 1; + continue; + } + if slot_of_next_confirmed_block == slot { break; } } - leader.unwrap() - }; - - let slot = start_slot + slot_index as u64; - let remaining_slots = total_slots - slot_index; - progress_bar.set_message(&format!( - "Checking slot {} ({:.}% done, {} slots remaining)...", - slot, - 100 * slot_index / total_slots, - remaining_slots, - )); - let slot_count = leader_slot_count.entry(leader).or_insert(0); - *slot_count += 1; - - let missed_slots = leader_missed_slots.entry(leader).or_insert(0); - - if !confirmed_blocks.contains(&slot) { *missed_slots += 1; + break; } } @@ -514,21 +522,24 @@ pub fn process_show_block_production( .bold() ); + let mut table = vec![]; for (leader, leader_slots) in leader_slot_count.iter() { let missed_slots = leader_missed_slots.get(leader).unwrap(); let blocks_produced = leader_slots - missed_slots; - println!( + table.push(format!( " {:<44} {:>15} {:>15} {:>15} {:>22.2}%", leader, leader_slots, blocks_produced, missed_slots, *missed_slots as f64 / *leader_slots as f64 * 100. - ); + )); } + table.sort(); println!( - "\n {:<44} {:>15} {:>15} {:>15} {:>22.2}%", + "{}\n\n {:<44} {:>15} {:>15} {:>15} {:>22.2}%", + table.join("\n"), format!("Epoch {} total:", epoch), total_slots, total_blocks,