* removes packet-count metrics from retransmit stage Working towards sending shreds (instead of packets) to retransmit stage so that shreds recovered from erasure codes are as well retransmitted. Following commit will add these metrics back to window-service, earlier in the pipeline. (cherry picked from commitbf437b0336
) # Conflicts: # core/src/retransmit_stage.rs * adds packet/shred count stats to window-service Adding back these metrics from the earlier commit which removed them from retransmit stage. (cherry picked from commit8198a7eae1
) * removes erroneous uses of Arc<...> from retransmit stage (cherry picked from commit6e413331b5
) # Conflicts: # core/src/retransmit_stage.rs # core/src/tvu.rs * sends shreds (instead of packets) to retransmit stage Working towards channelling through shreds recovered from erasure codes to retransmit stage. (cherry picked from commit3efccbffab
) # Conflicts: # core/src/retransmit_stage.rs * returns completed-data-set-info from insert_data_shred instead of opaque (u32, u32) which are then converted to CompletedDataSetInfo at the call-site. (cherry picked from commit3c71670bd9
) # Conflicts: # ledger/src/blockstore.rs * retransmits shreds recovered from erasure codes Shreds recovered from erasure codes have not been received from turbine and have not been retransmitted to other nodes downstream. This results in more repairs across the cluster which is slower. This commit channels through recovered shreds to retransmit stage in order to further broadcast the shreds to downstream nodes in the tree. (cherry picked from commit7a8807b8bb
) # Conflicts: # core/src/retransmit_stage.rs # core/src/window_service.rs * removes backport merge conflicts Co-authored-by: behzad nouri <behzadnouri@gmail.com>
47 lines
1.1 KiB
Rust
47 lines
1.1 KiB
Rust
// Get a unique hash value for a packet
|
|
// Used in retransmit and shred fetch to prevent dos with same packet data.
|
|
|
|
use {
|
|
ahash::AHasher,
|
|
rand::{thread_rng, Rng},
|
|
solana_ledger::shred::Shred,
|
|
solana_perf::packet::Packet,
|
|
std::hash::Hasher,
|
|
};
|
|
|
|
#[derive(Clone)]
|
|
pub struct PacketHasher {
|
|
seed1: u128,
|
|
seed2: u128,
|
|
}
|
|
|
|
impl Default for PacketHasher {
|
|
fn default() -> Self {
|
|
Self {
|
|
seed1: thread_rng().gen::<u128>(),
|
|
seed2: thread_rng().gen::<u128>(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl PacketHasher {
|
|
pub(crate) fn hash_packet(&self, packet: &Packet) -> u64 {
|
|
let size = packet.data.len().min(packet.meta.size);
|
|
self.hash_data(&packet.data[..size])
|
|
}
|
|
|
|
pub(crate) fn hash_shred(&self, shred: &Shred) -> u64 {
|
|
self.hash_data(&shred.payload)
|
|
}
|
|
|
|
fn hash_data(&self, data: &[u8]) -> u64 {
|
|
let mut hasher = AHasher::new_with_keys(self.seed1, self.seed2);
|
|
hasher.write(data);
|
|
hasher.finish()
|
|
}
|
|
|
|
pub fn reset(&mut self) {
|
|
*self = Self::default();
|
|
}
|
|
}
|