adds quic tvu port to contact-info (#31614)

Working towards migrating turbine to QUIC.
This commit is contained in:
behzad nouri 2023-05-15 15:13:21 +00:00 committed by GitHub
parent 376f562d8f
commit 5178d4d49b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 50 additions and 32 deletions

View File

@ -10,7 +10,7 @@ use {
solana_entry::entry::Entry, solana_entry::entry::Entry,
solana_gossip::{ solana_gossip::{
cluster_info::{ClusterInfo, Node}, cluster_info::{ClusterInfo, Node},
contact_info::ContactInfo, contact_info::{ContactInfo, Protocol},
}, },
solana_ledger::{ solana_ledger::{
genesis_utils::{create_genesis_config, GenesisConfigInfo}, genesis_utils::{create_genesis_config, GenesisConfigInfo},
@ -63,9 +63,9 @@ fn bench_retransmitter(bencher: &mut Bencher) {
let port = socket.local_addr().unwrap().port(); let port = socket.local_addr().unwrap().port();
contact_info.set_tvu((Ipv4Addr::LOCALHOST, port)).unwrap(); contact_info.set_tvu((Ipv4Addr::LOCALHOST, port)).unwrap();
contact_info contact_info
.set_tvu_forwards(contact_info.tvu().unwrap()) .set_tvu_forwards(contact_info.tvu(Protocol::UDP).unwrap())
.unwrap(); .unwrap();
info!("local: {:?}", contact_info.tvu().unwrap()); info!("local: {:?}", contact_info.tvu(Protocol::UDP).unwrap());
cluster_info.insert_info(contact_info); cluster_info.insert_info(contact_info);
socket.set_nonblocking(true).unwrap(); socket.set_nonblocking(true).unwrap();
socket socket

View File

@ -14,7 +14,10 @@ use {
}, },
crossbeam_channel::{unbounded, Receiver, RecvError, RecvTimeoutError, Sender}, crossbeam_channel::{unbounded, Receiver, RecvError, RecvTimeoutError, Sender},
itertools::Itertools, itertools::Itertools,
solana_gossip::cluster_info::{ClusterInfo, ClusterInfoError}, solana_gossip::{
cluster_info::{ClusterInfo, ClusterInfoError},
contact_info::Protocol,
},
solana_ledger::{blockstore::Blockstore, shred::Shred}, solana_ledger::{blockstore::Blockstore, shred::Shred},
solana_measure::measure::Measure, solana_measure::measure::Measure,
solana_metrics::{inc_new_counter_error, inc_new_counter_info}, solana_metrics::{inc_new_counter_error, inc_new_counter_info},
@ -412,7 +415,7 @@ pub fn broadcast_shreds(
shreds.filter_map(move |shred| { shreds.filter_map(move |shred| {
cluster_nodes cluster_nodes
.get_broadcast_peer(&shred.id())? .get_broadcast_peer(&shred.id())?
.tvu() .tvu(Protocol::UDP)
.ok() .ok()
.filter(|addr| socket_addr_space.check(addr)) .filter(|addr| socket_addr_space.check(addr))
.map(|addr| (shred.payload(), addr)) .map(|addr| (shred.payload(), addr))

View File

@ -3,7 +3,6 @@ use {
crate::cluster_nodes::ClusterNodesCache, crate::cluster_nodes::ClusterNodesCache,
itertools::Itertools, itertools::Itertools,
solana_entry::entry::Entry, solana_entry::entry::Entry,
solana_gossip::legacy_contact_info::LegacyContactInfo as ContactInfo,
solana_ledger::shred::{ProcessShredsStats, ReedSolomonCache, Shredder}, solana_ledger::shred::{ProcessShredsStats, ReedSolomonCache, Shredder},
solana_sdk::{ solana_sdk::{
hash::Hash, hash::Hash,
@ -305,7 +304,7 @@ impl BroadcastRun for BroadcastDuplicatesRun {
.iter() .iter()
.filter_map(|shred| { .filter_map(|shred| {
let node = cluster_nodes.get_broadcast_peer(&shred.id())?; let node = cluster_nodes.get_broadcast_peer(&shred.id())?;
if !socket_addr_space.check(&node.tvu().ok()?) { if !socket_addr_space.check(&node.tvu(Protocol::UDP).ok()?) {
return None; return None;
} }
if self if self
@ -338,7 +337,7 @@ impl BroadcastRun for BroadcastDuplicatesRun {
.iter() .iter()
.filter_map(|pubkey| { .filter_map(|pubkey| {
let tvu = cluster_info let tvu = cluster_info
.lookup_contact_info(pubkey, ContactInfo::tvu)? .lookup_contact_info(pubkey, |node| node.tvu(Protocol::UDP))?
.ok()?; .ok()?;
Some((shred.payload(), tvu)) Some((shred.payload(), tvu))
}) })
@ -346,7 +345,7 @@ impl BroadcastRun for BroadcastDuplicatesRun {
); );
} }
Some(vec![(shred.payload(), node.tvu().ok()?)]) Some(vec![(shred.payload(), node.tvu(Protocol::UDP).ok()?)])
}) })
.flatten() .flatten()
.collect(); .collect();

View File

@ -6,10 +6,10 @@ use {
rand_chacha::ChaChaRng, rand_chacha::ChaChaRng,
solana_gossip::{ solana_gossip::{
cluster_info::{compute_retransmit_peers, ClusterInfo, DATA_PLANE_FANOUT}, cluster_info::{compute_retransmit_peers, ClusterInfo, DATA_PLANE_FANOUT},
contact_info::{LegacyContactInfo as ContactInfo, LegacyContactInfo, Protocol},
crds::GossipRoute, crds::GossipRoute,
crds_gossip_pull::CRDS_GOSSIP_PULL_CRDS_TIMEOUT_MS, crds_gossip_pull::CRDS_GOSSIP_PULL_CRDS_TIMEOUT_MS,
crds_value::{CrdsData, CrdsValue}, crds_value::{CrdsData, CrdsValue},
legacy_contact_info::{LegacyContactInfo as ContactInfo, LegacyContactInfo},
weighted_shuffle::WeightedShuffle, weighted_shuffle::WeightedShuffle,
}, },
solana_ledger::shred::ShredId, solana_ledger::shred::ShredId,
@ -179,7 +179,7 @@ impl ClusterNodes<RetransmitStage> {
if neighbors.is_empty() { if neighbors.is_empty() {
let peers = children.into_iter().filter_map(|node| { let peers = children.into_iter().filter_map(|node| {
node.contact_info()? node.contact_info()?
.tvu() .tvu(Protocol::UDP)
.ok() .ok()
.filter(|addr| addrs.get(addr) == Some(&node.pubkey())) .filter(|addr| addrs.get(addr) == Some(&node.pubkey()))
}); });
@ -209,7 +209,7 @@ impl ClusterNodes<RetransmitStage> {
}) })
.chain(children.into_iter().filter_map(|node| { .chain(children.into_iter().filter_map(|node| {
node.contact_info()? node.contact_info()?
.tvu() .tvu(Protocol::UDP)
.ok() .ok()
.filter(|addr| addrs.get(addr) == Some(&node.pubkey())) .filter(|addr| addrs.get(addr) == Some(&node.pubkey()))
})); }));
@ -244,7 +244,7 @@ impl ClusterNodes<RetransmitStage> {
.map(|index| &self.nodes[index]) .map(|index| &self.nodes[index])
.inspect(|node| { .inspect(|node| {
if let Some(node) = node.contact_info() { if let Some(node) = node.contact_info() {
if let Ok(addr) = node.tvu() { if let Ok(addr) = node.tvu(Protocol::UDP) {
addrs.entry(addr).or_insert(*node.pubkey()); addrs.entry(addr).or_insert(*node.pubkey());
} }
if !drop_redundant_turbine_path { if !drop_redundant_turbine_path {

View File

@ -438,7 +438,7 @@ fn get_target(
info!("{:?}", node.gossip()); info!("{:?}", node.gossip());
target = match mode { target = match mode {
Mode::Gossip => Some((*node.pubkey(), node.gossip().unwrap())), Mode::Gossip => Some((*node.pubkey(), node.gossip().unwrap())),
Mode::Tvu => Some((*node.pubkey(), node.tvu().unwrap())), Mode::Tvu => Some((*node.pubkey(), node.tvu(Protocol::UDP).unwrap())),
Mode::TvuForwards => Some((*node.pubkey(), node.tvu_forwards().unwrap())), Mode::TvuForwards => Some((*node.pubkey(), node.tvu_forwards().unwrap())),
Mode::Tpu => Some((*node.pubkey(), node.tpu(protocol).unwrap())), Mode::Tpu => Some((*node.pubkey(), node.tpu(protocol).unwrap())),
Mode::TpuForwards => { Mode::TpuForwards => {

View File

@ -847,7 +847,7 @@ impl ClusterInfo {
self.addr_to_string(&ip_addr, &node.tpu_vote().ok()), self.addr_to_string(&ip_addr, &node.tpu_vote().ok()),
self.addr_to_string(&ip_addr, &node.tpu(contact_info::Protocol::UDP).ok()), self.addr_to_string(&ip_addr, &node.tpu(contact_info::Protocol::UDP).ok()),
self.addr_to_string(&ip_addr, &node.tpu_forwards(contact_info::Protocol::UDP).ok()), self.addr_to_string(&ip_addr, &node.tpu_forwards(contact_info::Protocol::UDP).ok()),
self.addr_to_string(&ip_addr, &node.tvu().ok()), self.addr_to_string(&ip_addr, &node.tvu(contact_info::Protocol::UDP).ok()),
self.addr_to_string(&ip_addr, &node.tvu_forwards().ok()), self.addr_to_string(&ip_addr, &node.tvu_forwards().ok()),
self.addr_to_string(&ip_addr, &node.repair().ok()), self.addr_to_string(&ip_addr, &node.repair().ok()),
self.addr_to_string(&ip_addr, &node.serve_repair().ok()), self.addr_to_string(&ip_addr, &node.serve_repair().ok()),
@ -1314,7 +1314,8 @@ impl ClusterInfo {
self.time_gossip_read_lock("all_tvu_peers", &self.stats.all_tvu_peers) self.time_gossip_read_lock("all_tvu_peers", &self.stats.all_tvu_peers)
.get_nodes_contact_info() .get_nodes_contact_info()
.filter(|node| { .filter(|node| {
node.pubkey() != &self_pubkey && self.check_socket_addr_space(&node.tvu()) node.pubkey() != &self_pubkey
&& self.check_socket_addr_space(&node.tvu(contact_info::Protocol::UDP))
}) })
.cloned() .cloned()
.collect() .collect()
@ -1329,7 +1330,7 @@ impl ClusterInfo {
.filter(|node| { .filter(|node| {
node.pubkey() != &self_pubkey node.pubkey() != &self_pubkey
&& node.shred_version() == self_shred_version && node.shred_version() == self_shred_version
&& self.check_socket_addr_space(&node.tvu()) && self.check_socket_addr_space(&node.tvu(contact_info::Protocol::UDP))
}) })
.cloned() .cloned()
.collect() .collect()
@ -1346,7 +1347,7 @@ impl ClusterInfo {
.filter(|node| { .filter(|node| {
node.pubkey() != &self_pubkey node.pubkey() != &self_pubkey
&& node.shred_version() == self_shred_version && node.shred_version() == self_shred_version
&& self.check_socket_addr_space(&node.tvu()) && self.check_socket_addr_space(&node.tvu(contact_info::Protocol::UDP))
&& self.check_socket_addr_space(&node.serve_repair()) && self.check_socket_addr_space(&node.serve_repair())
&& match gossip_crds.get::<&LowestSlot>(*node.pubkey()) { && match gossip_crds.get::<&LowestSlot>(*node.pubkey()) {
None => true, // fallback to legacy behavior None => true, // fallback to legacy behavior
@ -1361,7 +1362,7 @@ impl ClusterInfo {
![ ![
node.tpu(contact_info::Protocol::UDP), node.tpu(contact_info::Protocol::UDP),
node.gossip(), node.gossip(),
node.tvu(), node.tvu(contact_info::Protocol::UDP),
] ]
.into_iter() .into_iter()
.all(|addr| { .all(|addr| {

View File

@ -34,8 +34,9 @@ const SOCKET_TAG_TPU_QUIC: u8 = 8;
const SOCKET_TAG_TPU_VOTE: u8 = 9; const SOCKET_TAG_TPU_VOTE: u8 = 9;
const SOCKET_TAG_TVU: u8 = 10; const SOCKET_TAG_TVU: u8 = 10;
const SOCKET_TAG_TVU_FORWARDS: u8 = 11; const SOCKET_TAG_TVU_FORWARDS: u8 = 11;
const_assert_eq!(SOCKET_CACHE_SIZE, 12); const SOCKET_TAG_TVU_QUIC: u8 = 12;
const SOCKET_CACHE_SIZE: usize = SOCKET_TAG_TVU_FORWARDS as usize + 1usize; const_assert_eq!(SOCKET_CACHE_SIZE, 13);
const SOCKET_CACHE_SIZE: usize = SOCKET_TAG_TVU_QUIC as usize + 1usize;
#[derive(Debug, Error)] #[derive(Debug, Error)]
pub enum Error { pub enum Error {
@ -223,7 +224,7 @@ impl ContactInfo {
SOCKET_TAG_TPU_FORWARDS_QUIC SOCKET_TAG_TPU_FORWARDS_QUIC
); );
get_socket!(tpu_vote, SOCKET_TAG_TPU_VOTE); get_socket!(tpu_vote, SOCKET_TAG_TPU_VOTE);
get_socket!(tvu, SOCKET_TAG_TVU); get_socket!(tvu, SOCKET_TAG_TVU, SOCKET_TAG_TVU_QUIC);
get_socket!(tvu_forwards, SOCKET_TAG_TVU_FORWARDS); get_socket!(tvu_forwards, SOCKET_TAG_TVU_FORWARDS);
set_socket!(set_gossip, SOCKET_TAG_GOSSIP); set_socket!(set_gossip, SOCKET_TAG_GOSSIP);
@ -238,7 +239,7 @@ impl ContactInfo {
SOCKET_TAG_TPU_FORWARDS_QUIC SOCKET_TAG_TPU_FORWARDS_QUIC
); );
set_socket!(set_tpu_vote, SOCKET_TAG_TPU_VOTE); set_socket!(set_tpu_vote, SOCKET_TAG_TPU_VOTE);
set_socket!(set_tvu, SOCKET_TAG_TVU); set_socket!(set_tvu, SOCKET_TAG_TVU, SOCKET_TAG_TVU_QUIC);
set_socket!(set_tvu_forwards, SOCKET_TAG_TVU_FORWARDS); set_socket!(set_tvu_forwards, SOCKET_TAG_TVU_FORWARDS);
remove_socket!(remove_serve_repair, SOCKET_TAG_SERVE_REPAIR); remove_socket!(remove_serve_repair, SOCKET_TAG_SERVE_REPAIR);
@ -248,7 +249,7 @@ impl ContactInfo {
SOCKET_TAG_TPU_FORWARDS, SOCKET_TAG_TPU_FORWARDS,
SOCKET_TAG_TPU_FORWARDS_QUIC SOCKET_TAG_TPU_FORWARDS_QUIC
); );
remove_socket!(remove_tvu, SOCKET_TAG_TVU); remove_socket!(remove_tvu, SOCKET_TAG_TVU, SOCKET_TAG_TVU_QUIC);
remove_socket!(remove_tvu_forwards, SOCKET_TAG_TVU_FORWARDS); remove_socket!(remove_tvu_forwards, SOCKET_TAG_TVU_FORWARDS);
#[cfg(test)] #[cfg(test)]
@ -740,7 +741,14 @@ mod tests {
node.tpu_vote().ok().as_ref(), node.tpu_vote().ok().as_ref(),
sockets.get(&SOCKET_TAG_TPU_VOTE) sockets.get(&SOCKET_TAG_TPU_VOTE)
); );
assert_eq!(node.tvu().ok().as_ref(), sockets.get(&SOCKET_TAG_TVU)); assert_eq!(
node.tvu(Protocol::UDP).ok().as_ref(),
sockets.get(&SOCKET_TAG_TVU)
);
assert_eq!(
node.tvu(Protocol::QUIC).ok().as_ref(),
sockets.get(&SOCKET_TAG_TVU_QUIC)
);
assert_eq!( assert_eq!(
node.tvu_forwards().ok().as_ref(), node.tvu_forwards().ok().as_ref(),
sockets.get(&SOCKET_TAG_TVU_FORWARDS) sockets.get(&SOCKET_TAG_TVU_FORWARDS)
@ -827,7 +835,14 @@ mod tests {
) )
); );
assert_eq!(old.tpu_vote().unwrap(), node.tpu_vote().unwrap()); assert_eq!(old.tpu_vote().unwrap(), node.tpu_vote().unwrap());
assert_eq!(old.tvu().unwrap(), node.tvu().unwrap()); assert_eq!(
old.tvu(Protocol::QUIC).unwrap(),
node.tvu(Protocol::QUIC).unwrap()
);
assert_eq!(
old.tvu(Protocol::UDP).unwrap(),
node.tvu(Protocol::UDP).unwrap()
);
assert_eq!(old.tvu_forwards().unwrap(), node.tvu_forwards().unwrap()); assert_eq!(old.tvu_forwards().unwrap(), node.tvu_forwards().unwrap());
} }

View File

@ -195,7 +195,7 @@ impl LegacyContactInfo {
} }
get_socket!(gossip); get_socket!(gossip);
get_socket!(tvu); get_socket!(@quic tvu);
get_socket!(tvu_forwards); get_socket!(tvu_forwards);
get_socket!(repair); get_socket!(repair);
get_socket!(@quic tpu); get_socket!(@quic tpu);
@ -263,7 +263,7 @@ impl TryFrom<&ContactInfo> for LegacyContactInfo {
Ok(Self { Ok(Self {
id: *node.pubkey(), id: *node.pubkey(),
gossip: unwrap_socket!(gossip), gossip: unwrap_socket!(gossip),
tvu: unwrap_socket!(tvu), tvu: unwrap_socket!(tvu, Protocol::UDP),
tvu_forwards: unwrap_socket!(tvu_forwards), tvu_forwards: unwrap_socket!(tvu_forwards),
repair: unwrap_socket!(repair), repair: unwrap_socket!(repair),
tpu: unwrap_socket!(tpu, Protocol::UDP), tpu: unwrap_socket!(tpu, Protocol::UDP),

View File

@ -6,9 +6,9 @@ use {
rayon::iter::*, rayon::iter::*,
solana_gossip::{ solana_gossip::{
cluster_info::{ClusterInfo, Node}, cluster_info::{ClusterInfo, Node},
contact_info::{LegacyContactInfo as ContactInfo, Protocol},
crds::Cursor, crds::Cursor,
gossip_service::GossipService, gossip_service::GossipService,
legacy_contact_info::LegacyContactInfo as ContactInfo,
}, },
solana_perf::packet::Packet, solana_perf::packet::Packet,
solana_runtime::bank_forks::BankForks, solana_runtime::bank_forks::BankForks,
@ -136,7 +136,7 @@ fn retransmit_to(
} else { } else {
peers peers
.iter() .iter()
.filter_map(|peer| peer.tvu().ok()) .filter_map(|peer| peer.tvu(Protocol::UDP).ok())
.filter(|addr| socket_addr_space.check(addr)) .filter(|addr| socket_addr_space.check(addr))
.collect() .collect()
}; };

View File

@ -105,7 +105,7 @@ impl From<ContactInfo> for AdminRpcContactInfo {
id: node.pubkey().to_string(), id: node.pubkey().to_string(),
last_updated_timestamp: node.wallclock(), last_updated_timestamp: node.wallclock(),
gossip: unwrap_socket!(gossip), gossip: unwrap_socket!(gossip),
tvu: unwrap_socket!(tvu), tvu: unwrap_socket!(tvu, Protocol::UDP),
tvu_forwards: unwrap_socket!(tvu_forwards), tvu_forwards: unwrap_socket!(tvu_forwards),
repair: unwrap_socket!(repair), repair: unwrap_socket!(repair),
tpu: unwrap_socket!(tpu, Protocol::UDP), tpu: unwrap_socket!(tpu, Protocol::UDP),

View File

@ -95,7 +95,7 @@ fn verify_reachable_ports(
if verify_address(&node.info.tpu_vote().ok()) { if verify_address(&node.info.tpu_vote().ok()) {
udp_sockets.extend(node.sockets.tpu_vote.iter()); udp_sockets.extend(node.sockets.tpu_vote.iter());
} }
if verify_address(&node.info.tvu().ok()) { if verify_address(&node.info.tvu(Protocol::UDP).ok()) {
udp_sockets.extend(node.sockets.tvu.iter()); udp_sockets.extend(node.sockets.tvu.iter());
udp_sockets.extend(node.sockets.broadcast.iter()); udp_sockets.extend(node.sockets.broadcast.iter());
udp_sockets.extend(node.sockets.retransmit_sockets.iter()); udp_sockets.extend(node.sockets.retransmit_sockets.iter());