diff --git a/core/src/cluster_info.rs b/core/src/cluster_info.rs index 1da107546b0f08..04f80321721e14 100644 --- a/core/src/cluster_info.rs +++ b/core/src/cluster_info.rs @@ -84,6 +84,9 @@ const MAX_GOSSIP_TRAFFIC: usize = 128_000_000 / PACKET_DATA_SIZE; const NUM_BITS_PER_BYTE: u64 = 8; const MIN_SIZE_TO_COMPRESS_GZIP: u64 = 64; +/// Keep the number of snapshot hashes a node publishes under MAX_PROTOCOL_PAYLOAD_SIZE +pub const MAX_SNAPSHOT_HASHES: usize = 16; + #[derive(Debug, PartialEq, Eq)] pub enum ClusterInfoError { NoPeers, @@ -441,6 +444,14 @@ impl ClusterInfo { } pub fn push_snapshot_hashes(&mut self, snapshot_hashes: Vec<(Slot, Hash)>) { + if snapshot_hashes.len() > MAX_SNAPSHOT_HASHES { + warn!( + "snapshot_hashes too large, ignored: {}", + snapshot_hashes.len() + ); + return; + } + let now = timestamp(); let entry = CrdsValue::new_signed( CrdsData::SnapshotHash(SnapshotHash::new(self.id(), snapshot_hashes, now)), @@ -1056,7 +1067,7 @@ impl ClusterInfo { } /// Splits a Vec of CrdsValues into a nested Vec, trying to make sure that - /// each Vec is no larger than `PROTOCOL_PAYLOAD_SIZE` + /// each Vec is no larger than `MAX_PROTOCOL_PAYLOAD_SIZE` /// Note: some messages cannot be contained within that size so in the worst case this returns /// N nested Vecs with 1 item each. fn split_gossip_messages(msgs: Vec) -> Vec> { diff --git a/core/src/snapshot_packager_service.rs b/core/src/snapshot_packager_service.rs index 12de848a037d00..fae04b7559cc24 100644 --- a/core/src/snapshot_packager_service.rs +++ b/core/src/snapshot_packager_service.rs @@ -1,4 +1,4 @@ -use crate::cluster_info::ClusterInfo; +use crate::cluster_info::{ClusterInfo, MAX_SNAPSHOT_HASHES}; use solana_ledger::{ snapshot_package::SnapshotPackageReceiver, snapshot_utils::archive_snapshot_package, }; @@ -16,8 +16,6 @@ pub struct SnapshotPackagerService { t_snapshot_packager: JoinHandle<()>, } -const MAX_SNAPSHOT_HASHES: usize = 24; - impl SnapshotPackagerService { pub fn new( snapshot_package_receiver: SnapshotPackageReceiver,