diff --git a/core/src/blocktree.rs b/core/src/blocktree.rs index b8d5dc6910..8d198664bc 100644 --- a/core/src/blocktree.rs +++ b/core/src/blocktree.rs @@ -396,7 +396,7 @@ impl Blocktree { set_index as usize, slot, ) { - submit_metrics(true, "complete".into()); + submit_metrics(true, format!("complete. recovered: {}", result.len())); recovered_data_shreds.append(&mut result); } else { submit_metrics(true, "incomplete".into()); diff --git a/core/src/window_service.rs b/core/src/window_service.rs index c36e9bca4f..26958a20f2 100644 --- a/core/src/window_service.rs +++ b/core/src/window_service.rs @@ -25,6 +25,16 @@ use std::time::{Duration, Instant}; pub const NUM_THREADS: u32 = 10; +fn verify_shred_slot(shred: &Shred, root: u64) -> bool { + if shred.is_data() { + // Only data shreds have parent information + blocktree::verify_shred_slots(shred.slot(), shred.parent(), root) + } else { + // Filter out outdated coding shreds + shred.slot() >= root + } +} + /// drop blobs that are from myself or not from the correct leader for the /// blob's slot pub fn should_retransmit_and_persist( @@ -42,7 +52,7 @@ pub fn should_retransmit_and_persist( if leader_id == *my_pubkey { inc_new_counter_debug!("streamer-recv_window-circular_transmission", 1); false - } else if !blocktree::verify_shred_slots(shred.slot(), shred.parent(), root) { + } else if !verify_shred_slot(shred, root) { inc_new_counter_debug!("streamer-recv_window-outdated_transmission", 1); false } else if !shred.verify(&leader_id) {