Fix deserialize reference tick (#10111)

Co-authored-by: Carl <carl@solana.com>
This commit is contained in:
carllin
2020-05-19 13:55:37 -07:00
committed by GitHub
parent a235423000
commit a4047bb9c8
2 changed files with 12 additions and 10 deletions

View File

@ -1357,7 +1357,6 @@ impl Blockstore {
// the tick that will be used to figure out the timeout for this hole // the tick that will be used to figure out the timeout for this hole
let reference_tick = u64::from(Shred::reference_tick_from_data( let reference_tick = u64::from(Shred::reference_tick_from_data(
&db_iterator.value().expect("couldn't read value"), &db_iterator.value().expect("couldn't read value"),
current_slot,
)); ));
if ticks_since_first_insert < reference_tick + MAX_TURBINE_DELAY_IN_TICKS { if ticks_since_first_insert < reference_tick + MAX_TURBINE_DELAY_IN_TICKS {

View File

@ -451,9 +451,8 @@ impl Shred {
} }
} }
pub fn reference_tick_from_data(data: &[u8], slot: Slot) -> u8 { pub fn reference_tick_from_data(data: &[u8]) -> u8 {
let size_of_data_shred_header = Shredder::get_expected_data_header_size_from_slot(slot); let flags = data[SIZE_OF_COMMON_SHRED_HEADER + SIZE_OF_DATA_SHRED_HEADER - size_of::<u8>()];
let flags = data[SIZE_OF_COMMON_SHRED_HEADER + size_of_data_shred_header - size_of::<u8>()];
flags & SHRED_TICK_REFERENCE_MASK flags & SHRED_TICK_REFERENCE_MASK
} }
@ -1232,12 +1231,10 @@ pub mod tests {
assert_eq!(deserialized_shred, *data_shreds.last().unwrap()); assert_eq!(deserialized_shred, *data_shreds.last().unwrap());
} }
#[test] fn run_test_shred_reference_tick(slot: Slot) {
fn test_shred_reference_tick() {
let keypair = Arc::new(Keypair::new()); let keypair = Arc::new(Keypair::new());
let slot = 1;
let parent_slot = 0; let parent_slot = slot - 1;
let shredder = Shredder::new(slot, parent_slot, 0.0, keypair.clone(), 5, 0) let shredder = Shredder::new(slot, parent_slot, 0.0, keypair.clone(), 5, 0)
.expect("Failed in creating shredder"); .expect("Failed in creating shredder");
@ -1254,7 +1251,7 @@ pub mod tests {
let data_shreds = shredder.entries_to_shreds(&entries, true, 0).0; let data_shreds = shredder.entries_to_shreds(&entries, true, 0).0;
data_shreds.iter().for_each(|s| { data_shreds.iter().for_each(|s| {
assert_eq!(s.reference_tick(), 5); assert_eq!(s.reference_tick(), 5);
assert_eq!(Shred::reference_tick_from_data(&s.payload, slot), 5); assert_eq!(Shred::reference_tick_from_data(&s.payload), 5);
}); });
let deserialized_shred = let deserialized_shred =
@ -1262,6 +1259,12 @@ pub mod tests {
assert_eq!(deserialized_shred.reference_tick(), 5); assert_eq!(deserialized_shred.reference_tick(), 5);
} }
#[test]
fn test_shred_reference_tick() {
run_test_shred_reference_tick(UNLOCK_NONCE_SLOT);
run_test_shred_reference_tick(UNLOCK_NONCE_SLOT + 1);
}
#[test] #[test]
fn test_shred_reference_tick_overflow() { fn test_shred_reference_tick_overflow() {
let keypair = Arc::new(Keypair::new()); let keypair = Arc::new(Keypair::new());
@ -1285,7 +1288,7 @@ pub mod tests {
data_shreds.iter().for_each(|s| { data_shreds.iter().for_each(|s| {
assert_eq!(s.reference_tick(), SHRED_TICK_REFERENCE_MASK); assert_eq!(s.reference_tick(), SHRED_TICK_REFERENCE_MASK);
assert_eq!( assert_eq!(
Shred::reference_tick_from_data(&s.payload, slot), Shred::reference_tick_from_data(&s.payload),
SHRED_TICK_REFERENCE_MASK SHRED_TICK_REFERENCE_MASK
); );
}); });