Add reference tick to data shreds (#6772)
* Add reference tick to data shreds * fix tests
This commit is contained in:
@ -44,6 +44,7 @@ impl BroadcastRun for BroadcastFakeBlobsRun {
|
||||
bank.parent().unwrap().slot(),
|
||||
RECOMMENDED_FEC_RATE,
|
||||
keypair.clone(),
|
||||
(bank.tick_height() % bank.ticks_per_slot()) as u8,
|
||||
)
|
||||
.expect("Expected to create a new shredder");
|
||||
|
||||
|
@ -42,6 +42,7 @@ impl BroadcastRun for FailEntryVerificationBroadcastRun {
|
||||
bank.parent().unwrap().slot(),
|
||||
RECOMMENDED_FEC_RATE,
|
||||
keypair.clone(),
|
||||
(bank.tick_height() % bank.ticks_per_slot()) as u8,
|
||||
)
|
||||
.expect("Expected to create a new shredder");
|
||||
|
||||
|
@ -2,7 +2,7 @@ use super::broadcast_utils::{self, ReceiveResults};
|
||||
use super::*;
|
||||
use crate::broadcast_stage::broadcast_utils::UnfinishedSlotInfo;
|
||||
use solana_ledger::entry::Entry;
|
||||
use solana_ledger::shred::{Shred, Shredder, RECOMMENDED_FEC_RATE};
|
||||
use solana_ledger::shred::{Shred, Shredder, RECOMMENDED_FEC_RATE, SHRED_TICK_REFERENCE_MASK};
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use solana_sdk::signature::Keypair;
|
||||
use solana_sdk::timing::duration_as_us;
|
||||
@ -48,7 +48,7 @@ impl StandardBroadcastRun {
|
||||
}
|
||||
}
|
||||
|
||||
fn check_for_interrupted_slot(&mut self) -> Option<Shred> {
|
||||
fn check_for_interrupted_slot(&mut self, max_ticks_in_slot: u8) -> Option<Shred> {
|
||||
let (slot, _) = self.current_slot_and_parent.unwrap();
|
||||
let mut last_unfinished_slot_shred = self
|
||||
.unfinished_slot
|
||||
@ -62,6 +62,7 @@ impl StandardBroadcastRun {
|
||||
None,
|
||||
true,
|
||||
true,
|
||||
max_ticks_in_slot & SHRED_TICK_REFERENCE_MASK,
|
||||
))
|
||||
} else {
|
||||
None
|
||||
@ -83,6 +84,7 @@ impl StandardBroadcastRun {
|
||||
blocktree: &Blocktree,
|
||||
entries: &[Entry],
|
||||
is_slot_end: bool,
|
||||
reference_tick: u8,
|
||||
) -> (Vec<Shred>, Vec<Shred>) {
|
||||
let (slot, parent_slot) = self.current_slot_and_parent.unwrap();
|
||||
let shredder = Shredder::new(
|
||||
@ -90,6 +92,7 @@ impl StandardBroadcastRun {
|
||||
parent_slot,
|
||||
RECOMMENDED_FEC_RATE,
|
||||
self.keypair.clone(),
|
||||
reference_tick,
|
||||
)
|
||||
.expect("Expected to create a new shredder");
|
||||
|
||||
@ -149,13 +152,15 @@ impl StandardBroadcastRun {
|
||||
let to_shreds_start = Instant::now();
|
||||
|
||||
// 1) Check if slot was interrupted
|
||||
let last_unfinished_slot_shred = self.check_for_interrupted_slot();
|
||||
let last_unfinished_slot_shred =
|
||||
self.check_for_interrupted_slot(bank.ticks_per_slot() as u8);
|
||||
|
||||
// 2) Convert entries to shreds and coding shreds
|
||||
let (mut data_shreds, coding_shreds) = self.entries_to_shreds(
|
||||
blocktree,
|
||||
&receive_results.entries,
|
||||
last_tick_height == bank.max_tick_height(),
|
||||
(bank.tick_height() % bank.ticks_per_slot()) as u8,
|
||||
);
|
||||
if let Some(last_shred) = last_unfinished_slot_shred {
|
||||
data_shreds.push(last_shred);
|
||||
@ -353,7 +358,7 @@ mod test {
|
||||
|
||||
// Slot 2 interrupted slot 1
|
||||
let shred = run
|
||||
.check_for_interrupted_slot()
|
||||
.check_for_interrupted_slot(0)
|
||||
.expect("Expected a shred that signals an interrupt");
|
||||
|
||||
// Validate the shred
|
||||
|
@ -166,7 +166,7 @@ mod tests {
|
||||
hasher.hash(&buf[..size]);
|
||||
|
||||
// golden needs to be updated if blob stuff changes....
|
||||
let golden: Hash = "BdmY3efqu7zbnFuGRAeFANwa35HkDdQ7hwhYez3xGXiM"
|
||||
let golden: Hash = "HLzH7Nrh4q2K5WTh3e9vPNFZ1QVYhVDRMN9u5v51GqpJ"
|
||||
.parse()
|
||||
.unwrap();
|
||||
|
||||
|
@ -1137,7 +1137,7 @@ mod test {
|
||||
let payload_len = SIZE_OF_DATA_SHRED_PAYLOAD;
|
||||
let gibberish = [0xa5u8; PACKET_DATA_SIZE];
|
||||
let mut data_header = DataShredHeader::default();
|
||||
data_header.flags = DATA_COMPLETE_SHRED;
|
||||
data_header.flags |= DATA_COMPLETE_SHRED;
|
||||
let mut shred = Shred::new_empty_from_header(
|
||||
ShredCommonHeader::default(),
|
||||
data_header,
|
||||
|
@ -93,8 +93,15 @@ pub mod tests {
|
||||
#[test]
|
||||
fn test_sigverify_shreds_read_slots() {
|
||||
solana_logger::setup();
|
||||
let mut shred =
|
||||
Shred::new_from_data(0xdeadc0de, 0xc0de, 0xdead, Some(&[1, 2, 3, 4]), true, true);
|
||||
let mut shred = Shred::new_from_data(
|
||||
0xdeadc0de,
|
||||
0xc0de,
|
||||
0xdead,
|
||||
Some(&[1, 2, 3, 4]),
|
||||
true,
|
||||
true,
|
||||
0,
|
||||
);
|
||||
let mut batch = [Packets::default(), Packets::default()];
|
||||
|
||||
let keypair = Keypair::new();
|
||||
@ -103,8 +110,15 @@ pub mod tests {
|
||||
batch[0].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
|
||||
batch[0].packets[0].meta.size = shred.payload.len();
|
||||
|
||||
let mut shred =
|
||||
Shred::new_from_data(0xc0dedead, 0xc0de, 0xdead, Some(&[1, 2, 3, 4]), true, true);
|
||||
let mut shred = Shred::new_from_data(
|
||||
0xc0dedead,
|
||||
0xc0de,
|
||||
0xdead,
|
||||
Some(&[1, 2, 3, 4]),
|
||||
true,
|
||||
true,
|
||||
0,
|
||||
);
|
||||
Shredder::sign_shred(&keypair, &mut shred);
|
||||
batch[1].packets.resize(1, Packet::default());
|
||||
batch[1].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
|
||||
@ -127,12 +141,12 @@ pub mod tests {
|
||||
let mut batch = vec![Packets::default()];
|
||||
batch[0].packets.resize(2, Packet::default());
|
||||
|
||||
let mut shred = Shred::new_from_data(0, 0xc0de, 0xdead, Some(&[1, 2, 3, 4]), true, true);
|
||||
let mut shred = Shred::new_from_data(0, 0xc0de, 0xdead, Some(&[1, 2, 3, 4]), true, true, 0);
|
||||
Shredder::sign_shred(&leader_keypair, &mut shred);
|
||||
batch[0].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
|
||||
batch[0].packets[0].meta.size = shred.payload.len();
|
||||
|
||||
let mut shred = Shred::new_from_data(0, 0xbeef, 0xc0de, Some(&[1, 2, 3, 4]), true, true);
|
||||
let mut shred = Shred::new_from_data(0, 0xbeef, 0xc0de, Some(&[1, 2, 3, 4]), true, true, 0);
|
||||
let wrong_keypair = Keypair::new();
|
||||
Shredder::sign_shred(&wrong_keypair, &mut shred);
|
||||
batch[0].packets[1].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
|
||||
|
@ -315,7 +315,7 @@ mod test {
|
||||
parent: Slot,
|
||||
keypair: &Arc<Keypair>,
|
||||
) -> Vec<Shred> {
|
||||
let shredder = Shredder::new(slot, parent, 0.0, keypair.clone())
|
||||
let shredder = Shredder::new(slot, parent, 0.0, keypair.clone(), 0)
|
||||
.expect("Failed to create entry shredder");
|
||||
shredder.entries_to_shreds(&entries, true, 0).0
|
||||
}
|
||||
|
Reference in New Issue
Block a user