simplifies Serialize/Deserialize implementations for ShredType (#24601)

This commit is contained in:
behzad nouri 2022-04-23 13:33:59 +00:00 committed by GitHub
parent 8bfde0940f
commit 92ad767738
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 37 deletions

3
Cargo.lock generated
View File

@ -5023,9 +5023,8 @@ dependencies = [
"log", "log",
"lru", "lru",
"matches", "matches",
"num-derive",
"num-traits",
"num_cpus", "num_cpus",
"num_enum",
"prost", "prost",
"rand 0.7.3", "rand 0.7.3",
"rand_chacha 0.2.2", "rand_chacha 0.2.2",

View File

@ -23,9 +23,8 @@ lazy_static = "1.4.0"
libc = "0.2.124" libc = "0.2.124"
log = { version = "0.4.14" } log = { version = "0.4.14" }
lru = "0.7.5" lru = "0.7.5"
num-derive = "0.3"
num-traits = "0.2"
num_cpus = "1.13.1" num_cpus = "1.13.1"
num_enum = "0.5.4"
prost = "0.10.0" prost = "0.10.0"
rand = "0.7.0" rand = "0.7.0"
rand_chacha = "0.2.2" rand_chacha = "0.2.2"

View File

@ -53,10 +53,9 @@ pub use crate::shred_stats::{ProcessShredsStats, ShredFetchStats};
use { use {
crate::{blockstore::MAX_DATA_SHREDS_PER_SLOT, erasure::Session}, crate::{blockstore::MAX_DATA_SHREDS_PER_SLOT, erasure::Session},
bincode::config::Options, bincode::config::Options,
num_derive::FromPrimitive, num_enum::{IntoPrimitive, TryFromPrimitive},
num_traits::FromPrimitive,
rayon::{prelude::*, ThreadPool}, rayon::{prelude::*, ThreadPool},
serde::{Deserialize, Deserializer, Serialize, Serializer}, serde::{Deserialize, Serialize},
solana_entry::entry::{create_ticks, Entry}, solana_entry::entry::{create_ticks, Entry},
solana_measure::measure::Measure, solana_measure::measure::Measure,
solana_perf::packet::{limited_deserialize, Packet}, solana_perf::packet::{limited_deserialize, Packet},
@ -136,7 +135,21 @@ pub enum ShredError {
pub type Result<T> = std::result::Result<T, ShredError>; pub type Result<T> = std::result::Result<T, ShredError>;
#[repr(u8)] #[repr(u8)]
#[derive(Copy, Clone, Debug, Eq, FromPrimitive, Hash, PartialEq, AbiEnumVisitor, AbiExample)] #[derive(
Clone,
Copy,
Debug,
Eq,
Hash,
PartialEq,
AbiEnumVisitor,
AbiExample,
Deserialize,
IntoPrimitive,
Serialize,
TryFromPrimitive,
)]
#[serde(into = "u8", try_from = "u8")]
pub enum ShredType { pub enum ShredType {
Data = 0b1010_0101, Data = 0b1010_0101,
Code = 0b0101_1010, Code = 0b0101_1010,
@ -148,26 +161,6 @@ impl Default for ShredType {
} }
} }
impl Serialize for ShredType {
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: Serializer,
{
(*self as u8).serialize(serializer)
}
}
impl<'de> Deserialize<'de> for ShredType {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let shred_type = u8::deserialize(deserializer)?;
Self::from_u8(shred_type)
.ok_or_else(|| serde::de::Error::custom(ShredError::InvalidShredType))
}
}
/// A common header that is present in data and code shred headers /// A common header that is present in data and code shred headers
#[derive(Serialize, Clone, Deserialize, Default, PartialEq, Debug)] #[derive(Serialize, Clone, Deserialize, Default, PartialEq, Debug)]
pub struct ShredCommonHeader { pub struct ShredCommonHeader {
@ -1110,12 +1103,12 @@ pub fn get_shred_slot_index_type(
} }
}; };
let shred_type = match ShredType::from_u8(p.data[OFFSET_OF_SHRED_TYPE]) { let shred_type = match ShredType::try_from(p.data[OFFSET_OF_SHRED_TYPE]) {
None => { Err(_) => {
stats.bad_shred_type += 1; stats.bad_shred_type += 1;
return None; return None;
} }
Some(shred_type) => shred_type, Ok(shred_type) => shred_type,
}; };
Some((slot, index, shred_type)) Some((slot, index, shred_type))
} }
@ -2013,12 +2006,13 @@ pub mod tests {
#[test] #[test]
fn test_shred_type_compat() { fn test_shred_type_compat() {
assert_eq!(std::mem::size_of::<ShredType>(), std::mem::size_of::<u8>()); assert_eq!(std::mem::size_of::<ShredType>(), std::mem::size_of::<u8>());
assert_eq!(ShredType::from_u8(0), None); assert_matches!(ShredType::try_from(0u8), Err(_));
assert_eq!(ShredType::from_u8(1), None); assert_matches!(ShredType::try_from(1u8), Err(_));
assert_matches!(bincode::deserialize::<ShredType>(&[0u8]), Err(_)); assert_matches!(bincode::deserialize::<ShredType>(&[0u8]), Err(_));
assert_matches!(bincode::deserialize::<ShredType>(&[1u8]), Err(_));
// data shred // data shred
assert_eq!(ShredType::Data as u8, 0b1010_0101); assert_eq!(ShredType::Data as u8, 0b1010_0101);
assert_eq!(ShredType::from_u8(0b1010_0101), Some(ShredType::Data)); assert_eq!(ShredType::try_from(0b1010_0101), Ok(ShredType::Data));
let buf = bincode::serialize(&ShredType::Data).unwrap(); let buf = bincode::serialize(&ShredType::Data).unwrap();
assert_eq!(buf, vec![0b1010_0101]); assert_eq!(buf, vec![0b1010_0101]);
assert_matches!( assert_matches!(
@ -2027,7 +2021,7 @@ pub mod tests {
); );
// coding shred // coding shred
assert_eq!(ShredType::Code as u8, 0b0101_1010); assert_eq!(ShredType::Code as u8, 0b0101_1010);
assert_eq!(ShredType::from_u8(0b0101_1010), Some(ShredType::Code)); assert_eq!(ShredType::try_from(0b0101_1010), Ok(ShredType::Code));
let buf = bincode::serialize(&ShredType::Code).unwrap(); let buf = bincode::serialize(&ShredType::Code).unwrap();
assert_eq!(buf, vec![0b0101_1010]); assert_eq!(buf, vec![0b0101_1010]);
assert_matches!( assert_matches!(

View File

@ -4529,9 +4529,8 @@ dependencies = [
"libc", "libc",
"log", "log",
"lru", "lru",
"num-derive",
"num-traits",
"num_cpus", "num_cpus",
"num_enum",
"prost", "prost",
"rand 0.7.3", "rand 0.7.3",
"rand_chacha 0.2.2", "rand_chacha 0.2.2",