diff --git a/core/src/shred.rs b/core/src/shred.rs index 36b551e34d..4af26debe6 100644 --- a/core/src/shred.rs +++ b/core/src/shred.rs @@ -356,16 +356,19 @@ impl Shredder { }); let unsigned_coding_shred_start = self.shreds.len(); - self.generate_coding_shreds(); - let signature_offset = *SIZE_OF_SHRED_TYPE; - PAR_THREAD_POOL.with(|thread_pool| { - thread_pool.borrow().install(|| { - self.shreds[unsigned_coding_shred_start..] - .par_iter_mut() - .for_each(|d| Self::sign_shred(&signer, d, signature_offset)); - }) - }); - + if self.fec_rate > 0.0 { + self.generate_coding_shreds(); + let signature_offset = *SIZE_OF_SHRED_TYPE; + PAR_THREAD_POOL.with(|thread_pool| { + thread_pool.borrow().install(|| { + self.shreds[unsigned_coding_shred_start..] + .par_iter_mut() + .for_each(|d| Self::sign_shred(&signer, d, signature_offset)); + }) + }); + } else { + self.fec_set_index = self.index; + } self.fec_set_shred_start = self.shreds.len(); } @@ -879,6 +882,17 @@ mod tests { verify_test_code_shred(&shred, 2, slot, &keypair.pubkey(), true); } + #[test] + fn test_large_data_shredder() { + let keypair = Arc::new(Keypair::new()); + let mut shredder = + Shredder::new(1, 0, 0.0, &keypair, 0).expect("Failed in creating shredder"); + + let data = vec![0u8; 1000 * 1000]; + bincode::serialize_into(&mut shredder, &data).unwrap(); + assert!(shredder.shreds.len() > data.len() / PACKET_DATA_SIZE); + } + #[test] fn test_recovery_and_reassembly() { let keypair = Arc::new(Keypair::new());