From 14cb6353c02cc5c8f2a3dbe245fb40bc20c3f85b Mon Sep 17 00:00:00 2001 From: Sagar Dhawan Date: Tue, 17 Sep 2019 11:59:14 -0700 Subject: [PATCH] Change erasure ratio to 0.25 and increase data shreds to 16 (#5931) * Change erasure ratio to 0.25 and increase data shreds to 16 * Fix case where no coding shreds are requested --- core/src/broadcast_stage/broadcast_utils.rs | 13 +++++++++---- core/src/shred.rs | 7 +++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/core/src/broadcast_stage/broadcast_utils.rs b/core/src/broadcast_stage/broadcast_utils.rs index 4442b674e..bb3df6ddc 100644 --- a/core/src/broadcast_stage/broadcast_utils.rs +++ b/core/src/broadcast_stage/broadcast_utils.rs @@ -1,7 +1,7 @@ use crate::entry::Entry; use crate::poh_recorder::WorkingBankEntries; use crate::result::Result; -use crate::shred::{Shred, ShredInfo, Shredder}; +use crate::shred::{Shred, ShredInfo, Shredder, RECOMMENDED_FEC_RATE}; use solana_runtime::bank::Bank; use solana_sdk::signature::Keypair; use std::sync::mpsc::Receiver; @@ -88,9 +88,14 @@ pub(super) fn entries_to_shreds( .for_each(|(i, entries_tuple)| { let (entries, _): (Vec<_>, Vec<_>) = entries_tuple.into_iter().unzip(); //entries - let mut shredder = - Shredder::new(slot, parent_slot, 1.0, keypair, latest_shred_index as u32) - .expect("Expected to create a new shredder"); + let mut shredder = Shredder::new( + slot, + parent_slot, + RECOMMENDED_FEC_RATE, + keypair, + latest_shred_index as u32, + ) + .expect("Expected to create a new shredder"); bincode::serialize_into(&mut shredder, &entries) .expect("Expect to write all entries to shreds"); diff --git a/core/src/shred.rs b/core/src/shred.rs index e1fb0536e..60bd51358 100644 --- a/core/src/shred.rs +++ b/core/src/shred.rs @@ -168,7 +168,9 @@ pub enum Shred { /// This limit comes from reed solomon library, but unfortunately they don't have /// a public constant defined for it. -const MAX_DATA_SHREDS_PER_FEC_BLOCK: u32 = 4; +const MAX_DATA_SHREDS_PER_FEC_BLOCK: u32 = 16; +/// Based on rse benchmarks, the optimal erasure config uses 16 data shreds and 4 coding shreds +pub const RECOMMENDED_FEC_RATE: f32 = 0.25; const LAST_SHRED_IN_SLOT: u8 = 0b0000_0001; const DATA_COMPLETE_SHRED: u8 = 0b0000_0010; @@ -624,7 +626,8 @@ impl Shredder { fn generate_coding_shreds(&mut self) { if self.fec_rate != 0.0 { let num_data = (self.index - self.fec_set_index) as usize; - let num_coding = (self.fec_rate * num_data as f32) as usize; + // always generate at least 1 coding shred even if the fec_rate doesn't allow it + let num_coding = 1.max((self.fec_rate * num_data as f32) as usize); let session = Session::new(num_data, num_coding).expect("Failed to create erasure session"); let start_index = self.index - num_data as u32;