From a4047bb9c87dd191839248c680c5890194cb283d Mon Sep 17 00:00:00 2001 From: carllin Date: Tue, 19 May 2020 13:55:37 -0700 Subject: [PATCH] Fix deserialize reference tick (#10111) Co-authored-by: Carl --- ledger/src/blockstore.rs | 1 - ledger/src/shred.rs | 21 ++++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index 0c84bd95b0..6298646661 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -1357,7 +1357,6 @@ impl Blockstore { // the tick that will be used to figure out the timeout for this hole let reference_tick = u64::from(Shred::reference_tick_from_data( &db_iterator.value().expect("couldn't read value"), - current_slot, )); if ticks_since_first_insert < reference_tick + MAX_TURBINE_DELAY_IN_TICKS { diff --git a/ledger/src/shred.rs b/ledger/src/shred.rs index 6fb2823afa..8c10fbeaa7 100644 --- a/ledger/src/shred.rs +++ b/ledger/src/shred.rs @@ -451,9 +451,8 @@ impl Shred { } } - pub fn reference_tick_from_data(data: &[u8], slot: Slot) -> 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::()]; + pub fn reference_tick_from_data(data: &[u8]) -> u8 { + let flags = data[SIZE_OF_COMMON_SHRED_HEADER + SIZE_OF_DATA_SHRED_HEADER - size_of::()]; flags & SHRED_TICK_REFERENCE_MASK } @@ -1232,12 +1231,10 @@ pub mod tests { assert_eq!(deserialized_shred, *data_shreds.last().unwrap()); } - #[test] - fn test_shred_reference_tick() { + fn run_test_shred_reference_tick(slot: Slot) { 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) .expect("Failed in creating shredder"); @@ -1254,7 +1251,7 @@ pub mod tests { let data_shreds = shredder.entries_to_shreds(&entries, true, 0).0; data_shreds.iter().for_each(|s| { 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 = @@ -1262,6 +1259,12 @@ pub mod tests { 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] fn test_shred_reference_tick_overflow() { let keypair = Arc::new(Keypair::new()); @@ -1285,7 +1288,7 @@ pub mod tests { data_shreds.iter().for_each(|s| { assert_eq!(s.reference_tick(), SHRED_TICK_REFERENCE_MASK); assert_eq!( - Shred::reference_tick_from_data(&s.payload, slot), + Shred::reference_tick_from_data(&s.payload), SHRED_TICK_REFERENCE_MASK ); });