Fix deserialize reference tick (#10111)
Co-authored-by: Carl <carl@solana.com>
This commit is contained in:
@ -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 {
|
||||||
|
@ -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
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user