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_gossip::{
cluster_info::{ClusterInfo, Node},
contact_info::ContactInfo,
contact_info::{ContactInfo, Protocol},
},
solana_ledger::{
genesis_utils::{create_genesis_config, GenesisConfigInfo},
@ -63,9 +63,9 @@ fn bench_retransmitter(bencher: &mut Bencher) {
let port = socket.local_addr().unwrap().port();
contact_info.set_tvu((Ipv4Addr::LOCALHOST, port)).unwrap();
contact_info
.set_tvu_forwards(contact_info.tvu().unwrap())
.set_tvu_forwards(contact_info.tvu(Protocol::UDP).unwrap())
.unwrap();
info!("local: {:?}", contact_info.tvu().unwrap());
info!("local: {:?}", contact_info.tvu(Protocol::UDP).unwrap());
cluster_info.insert_info(contact_info);
socket.set_nonblocking(true).unwrap();
socket

View File

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

View File

@ -3,7 +3,6 @@ use {
crate::cluster_nodes::ClusterNodesCache,
itertools::Itertools,
solana_entry::entry::Entry,
solana_gossip::legacy_contact_info::LegacyContactInfo as ContactInfo,
solana_ledger::shred::{ProcessShredsStats, ReedSolomonCache, Shredder},
solana_sdk::{
hash::Hash,
@ -305,7 +304,7 @@ impl BroadcastRun for BroadcastDuplicatesRun {
.iter()
.filter_map(|shred| {
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;
}
if self
@ -338,7 +337,7 @@ impl BroadcastRun for BroadcastDuplicatesRun {
.iter()
.filter_map(|pubkey| {
let tvu = cluster_info
.lookup_contact_info(pubkey, ContactInfo::tvu)?
.lookup_contact_info(pubkey, |node| node.tvu(Protocol::UDP))?
.ok()?;
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()
.collect();

View File

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

View File

@ -438,7 +438,7 @@ fn get_target(
info!("{:?}", node.gossip());
target = match mode {
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::Tpu => Some((*node.pubkey(), node.tpu(protocol).unwrap())),
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(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.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)
.get_nodes_contact_info()
.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()
.collect()
@ -1329,7 +1330,7 @@ impl ClusterInfo {
.filter(|node| {
node.pubkey() != &self_pubkey
&& 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()
.collect()
@ -1346,7 +1347,7 @@ impl ClusterInfo {
.filter(|node| {
node.pubkey() != &self_pubkey
&& 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())
&& match gossip_crds.get::<&LowestSlot>(*node.pubkey()) {
None => true, // fallback to legacy behavior
@ -1361,7 +1362,7 @@ impl ClusterInfo {
![
node.tpu(contact_info::Protocol::UDP),
node.gossip(),
node.tvu(),
node.tvu(contact_info::Protocol::UDP),
]
.into_iter()
.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_TVU: u8 = 10;
const SOCKET_TAG_TVU_FORWARDS: u8 = 11;
const_assert_eq!(SOCKET_CACHE_SIZE, 12);
const SOCKET_CACHE_SIZE: usize = SOCKET_TAG_TVU_FORWARDS as usize + 1usize;
const SOCKET_TAG_TVU_QUIC: u8 = 12;
const_assert_eq!(SOCKET_CACHE_SIZE, 13);
const SOCKET_CACHE_SIZE: usize = SOCKET_TAG_TVU_QUIC as usize + 1usize;
#[derive(Debug, Error)]
pub enum Error {
@ -223,7 +224,7 @@ impl ContactInfo {
SOCKET_TAG_TPU_FORWARDS_QUIC
);
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);
set_socket!(set_gossip, SOCKET_TAG_GOSSIP);
@ -238,7 +239,7 @@ impl ContactInfo {
SOCKET_TAG_TPU_FORWARDS_QUIC
);
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);
remove_socket!(remove_serve_repair, SOCKET_TAG_SERVE_REPAIR);
@ -248,7 +249,7 @@ impl ContactInfo {
SOCKET_TAG_TPU_FORWARDS,
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);
#[cfg(test)]
@ -740,7 +741,14 @@ mod tests {
node.tpu_vote().ok().as_ref(),
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!(
node.tvu_forwards().ok().as_ref(),
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.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());
}

View File

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

View File

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

View File

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

View File

@ -95,7 +95,7 @@ fn verify_reachable_ports(
if verify_address(&node.info.tpu_vote().ok()) {
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.broadcast.iter());
udp_sockets.extend(node.sockets.retransmit_sockets.iter());