diff --git a/ledger/src/blockstore_meta.rs b/ledger/src/blockstore_meta.rs index 41b6ffb179..dd7877ac49 100644 --- a/ledger/src/blockstore_meta.rs +++ b/ledger/src/blockstore_meta.rs @@ -1,8 +1,5 @@ use { - crate::{ - erasure::ErasureConfig, - shred::{Shred, ShredType}, - }, + crate::shred::{Shred, ShredType}, serde::{Deserialize, Deserializer, Serialize, Serializer}, solana_sdk::{clock::Slot, hash::Hash}, std::{ @@ -93,6 +90,12 @@ pub struct ErasureMeta { config: ErasureConfig, } +#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub(crate) struct ErasureConfig { + num_data: usize, + num_coding: usize, +} + #[derive(Deserialize, Serialize)] pub struct DuplicateSlotProof { #[serde(with = "serde_bytes")] @@ -233,10 +236,10 @@ impl ErasureMeta { match shred.shred_type() { ShredType::Data => None, ShredType::Code => { - let config = ErasureConfig::new( - usize::from(shred.num_data_shreds().ok()?), - usize::from(shred.num_coding_shreds().ok()?), - ); + let config = ErasureConfig { + num_data: usize::from(shred.num_data_shreds().ok()?), + num_coding: usize::from(shred.num_coding_shreds().ok()?), + }; let first_coding_index = u64::from(shred.first_coding_index()?); let erasure_meta = ErasureMeta { set_index: u64::from(shred.fec_set_index()), @@ -265,12 +268,12 @@ impl ErasureMeta { } pub(crate) fn data_shreds_indices(&self) -> Range { - let num_data = self.config.num_data() as u64; + let num_data = self.config.num_data as u64; self.set_index..self.set_index + num_data } pub(crate) fn coding_shreds_indices(&self) -> Range { - let num_coding = self.config.num_coding() as u64; + let num_coding = self.config.num_coding as u64; self.first_coding_index..self.first_coding_index + num_coding } @@ -281,8 +284,8 @@ impl ErasureMeta { let num_data = index.data().range(self.data_shreds_indices()).count(); let (data_missing, num_needed) = ( - self.config.num_data().saturating_sub(num_data), - self.config.num_data().saturating_sub(num_data + num_coding), + self.config.num_data.saturating_sub(num_data), + self.config.num_data.saturating_sub(num_data + num_coding), ); if data_missing == 0 { @@ -336,8 +339,10 @@ mod test { use ErasureMetaStatus::*; let set_index = 0; - let erasure_config = ErasureConfig::new(8, 16); - + let erasure_config = ErasureConfig { + num_data: 8, + num_coding: 16, + }; let e_meta = ErasureMeta { set_index, first_coding_index: set_index, @@ -347,10 +352,10 @@ mod test { let mut rng = thread_rng(); let mut index = Index::new(0); - let data_indexes = 0..erasure_config.num_data() as u64; - let coding_indexes = 0..erasure_config.num_coding() as u64; + let data_indexes = 0..erasure_config.num_data as u64; + let coding_indexes = 0..erasure_config.num_coding as u64; - assert_eq!(e_meta.status(&index), StillNeed(erasure_config.num_data())); + assert_eq!(e_meta.status(&index), StillNeed(erasure_config.num_data)); for ix in data_indexes.clone() { index.data_mut().insert(ix); @@ -365,7 +370,7 @@ mod test { for &idx in data_indexes .clone() .collect::>() - .choose_multiple(&mut rng, erasure_config.num_data()) + .choose_multiple(&mut rng, erasure_config.num_data) { index.data_mut().index.remove(&idx); @@ -378,7 +383,7 @@ mod test { for &idx in coding_indexes .collect::>() - .choose_multiple(&mut rng, erasure_config.num_coding()) + .choose_multiple(&mut rng, erasure_config.num_coding) { index.coding_mut().index.remove(&idx); diff --git a/ledger/src/erasure.rs b/ledger/src/erasure.rs deleted file mode 100644 index 04cc684de9..0000000000 --- a/ledger/src/erasure.rs +++ /dev/null @@ -1,67 +0,0 @@ -//! # Erasure Coding and Recovery -//! -//! Shreds are logically grouped into erasure sets or blocks. Each set contains 16 sequential data -//! shreds and 4 sequential coding shreds. -//! -//! Coding shreds in each set starting from `start_idx`: -//! For each erasure set: -//! generate `NUM_CODING` coding_shreds. -//! index the coding shreds from `start_idx` to `start_idx + NUM_CODING - 1`. -//! -//! model of an erasure set, with top row being data shreds and second being coding -//! |<======================= NUM_DATA ==============================>| -//! |<==== NUM_CODING ===>| -//! +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ -//! | D | | D | | D | | D | | D | | D | | D | | D | | D | | D | -//! +---+ +---+ +---+ +---+ +---+ . . . +---+ +---+ +---+ +---+ +---+ -//! | C | | C | | C | | C | | | | | | | | | | | | | -//! +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ -//! -//! shred structure for coding shreds -//! -//! + ------- meta is set and used by transport, meta.size is actual length -//! | of data in the byte array shred.data -//! | -//! | + -- data is stuff shipped over the wire, and has an included -//! | | header -//! V V -//! +----------+------------------------------------------------------------+ -//! | meta | data | -//! |+---+-- |+---+---+---+---+------------------------------------------+| -//! || s | . || i | | f | s | || -//! || i | . || n | i | l | i | || -//! || z | . || d | d | a | z | shred.data(), or shred.data_mut() || -//! || e | || e | | g | e | || -//! |+---+-- || x | | s | | || -//! | |+---+---+---+---+------------------------------------------+| -//! +----------+------------------------------------------------------------+ -//! | |<=== coding shred part for "coding" =======>| -//! | | -//! |<============== data shred part for "coding" ==============>| -//! -//! - -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct ErasureConfig { - num_data: usize, - num_coding: usize, -} - -impl ErasureConfig { - pub(crate) fn new(num_data: usize, num_coding: usize) -> ErasureConfig { - ErasureConfig { - num_data, - num_coding, - } - } - - pub(crate) fn num_data(self) -> usize { - self.num_data - } - - pub(crate) fn num_coding(self) -> usize { - self.num_coding - } -} diff --git a/ledger/src/lib.rs b/ledger/src/lib.rs index d822b14114..e4db0a94e8 100644 --- a/ledger/src/lib.rs +++ b/ledger/src/lib.rs @@ -15,7 +15,6 @@ pub mod blockstore_db; pub mod blockstore_meta; pub mod blockstore_processor; pub mod builtins; -pub mod erasure; pub mod genesis_utils; pub mod leader_schedule; pub mod leader_schedule_cache;