From 26d3305b73fd10079e9f0853ac39c72a5a513c1d Mon Sep 17 00:00:00 2001 From: Ashwin Sekar Date: Mon, 22 Apr 2024 14:51:19 +0000 Subject: [PATCH 1/2] blockstore: store first received coding shred index in ErasureMeta --- ledger/src/blockstore_meta.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/ledger/src/blockstore_meta.rs b/ledger/src/blockstore_meta.rs index c56453d8835..920b577e483 100644 --- a/ledger/src/blockstore_meta.rs +++ b/ledger/src/blockstore_meta.rs @@ -125,9 +125,8 @@ pub struct ErasureMeta { set_index: u64, /// First coding index in the FEC set first_coding_index: u64, - /// Size of shards in this erasure set - #[serde(rename = "size")] - __unused_size: usize, + /// Index of the first received coding shred in the FEC set + first_received_coding_index: usize, /// Erasure configuration for this erasure set config: ErasureConfig, } @@ -348,11 +347,12 @@ impl ErasureMeta { num_coding: usize::from(shred.num_coding_shreds().ok()?), }; let first_coding_index = u64::from(shred.first_coding_index()?); + let first_received_coding_index = usize::try_from(shred.index()).ok()?; let erasure_meta = ErasureMeta { set_index: u64::from(shred.fec_set_index()), config, first_coding_index, - __unused_size: 0, + first_received_coding_index, }; Some(erasure_meta) } @@ -365,7 +365,7 @@ impl ErasureMeta { let Some(mut other) = Self::from_coding_shred(shred) else { return false; }; - other.__unused_size = self.__unused_size; + other.first_received_coding_index = self.first_received_coding_index; self == &other } @@ -392,6 +392,11 @@ impl ErasureMeta { self.first_coding_index..self.first_coding_index + num_coding } + #[allow(dead_code)] + pub(crate) fn first_received_coding_shred_index(&self) -> Option { + u32::try_from(self.first_received_coding_index).ok() + } + pub(crate) fn next_fec_set_index(&self) -> Option { let num_data = u64::try_from(self.config.num_data).ok()?; self.set_index @@ -568,7 +573,7 @@ mod test { set_index, first_coding_index: set_index, config: erasure_config, - __unused_size: 0, + first_received_coding_index: 0, }; let mut rng = thread_rng(); let mut index = Index::new(0); From bf5a23a05ff4ea7eadb2a8d5f0263911e1c6eda1 Mon Sep 17 00:00:00 2001 From: Ashwin Sekar Date: Mon, 22 Apr 2024 20:06:25 +0000 Subject: [PATCH 2/2] pr feedback: use u64 instead of usize --- ledger/src/blockstore_meta.rs | 54 +++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/ledger/src/blockstore_meta.rs b/ledger/src/blockstore_meta.rs index 920b577e483..8e97b9ac801 100644 --- a/ledger/src/blockstore_meta.rs +++ b/ledger/src/blockstore_meta.rs @@ -126,7 +126,7 @@ pub struct ErasureMeta { /// First coding index in the FEC set first_coding_index: u64, /// Index of the first received coding shred in the FEC set - first_received_coding_index: usize, + first_received_coding_index: u64, /// Erasure configuration for this erasure set config: ErasureConfig, } @@ -347,7 +347,7 @@ impl ErasureMeta { num_coding: usize::from(shred.num_coding_shreds().ok()?), }; let first_coding_index = u64::from(shred.first_coding_index()?); - let first_received_coding_index = usize::try_from(shred.index()).ok()?; + let first_received_coding_index = u64::from(shred.index()); let erasure_meta = ErasureMeta { set_index: u64::from(shred.fec_set_index()), config, @@ -726,4 +726,54 @@ mod test { assert_eq!(actual, expected); } + + #[test] + fn test_erasure_meta_transition() { + #[derive(Debug, Deserialize, PartialEq, Serialize)] + struct OldErasureMeta { + set_index: u64, + first_coding_index: u64, + #[serde(rename = "size")] + __unused_size: usize, + config: ErasureConfig, + } + + let set_index = 64; + let erasure_config = ErasureConfig { + num_data: 8, + num_coding: 16, + }; + let mut old_erasure_meta = OldErasureMeta { + set_index, + first_coding_index: set_index, + __unused_size: 0, + config: erasure_config, + }; + let mut new_erasure_meta = ErasureMeta { + set_index, + first_coding_index: set_index, + first_received_coding_index: 0, + config: erasure_config, + }; + + assert_eq!( + bincode::serialized_size(&old_erasure_meta).unwrap(), + bincode::serialized_size(&new_erasure_meta).unwrap(), + ); + + assert_eq!( + bincode::deserialize::(&bincode::serialize(&old_erasure_meta).unwrap()) + .unwrap(), + new_erasure_meta + ); + + new_erasure_meta.first_received_coding_index = u64::from(u32::max_value()); + old_erasure_meta.__unused_size = usize::try_from(u32::max_value()).unwrap(); + + assert_eq!( + bincode::deserialize::(&bincode::serialize(&new_erasure_meta).unwrap()) + .unwrap(), + old_erasure_meta + ); + } }