diff --git a/Cargo.lock b/Cargo.lock index 3c275ef2c3..ce0d463f81 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5060,6 +5060,7 @@ dependencies = [ "rand 0.7.3", "rand_chacha 0.2.2", "rayon", + "regex", "rustc_version 0.4.0", "serde", "serde_bytes", diff --git a/gossip/Cargo.toml b/gossip/Cargo.toml index c941ae3866..df5cb02826 100644 --- a/gossip/Cargo.toml +++ b/gossip/Cargo.toml @@ -48,6 +48,7 @@ solana-vote-program = { path = "../programs/vote", version = "=1.11.0" } thiserror = "1.0" [dev-dependencies] +regex = "1" num_cpus = "1.13.1" serial_test = "0.6.0" diff --git a/gossip/src/cluster_info.rs b/gossip/src/cluster_info.rs index 45b3a4ae45..f18b23af4c 100644 --- a/gossip/src/cluster_info.rs +++ b/gossip/src/cluster_info.rs @@ -728,8 +728,8 @@ impl ClusterInfo { format!( "RPC Address |Age(ms)| Node identifier \ | Version | RPC |PubSub|ShredVer\n\ - ------------------+-------+----------------------------------------------+---------+\ - ------+------+--------\n\ + ------------------+-------+----------------------------------------------\ + +---------+------+------+--------\n\ {}\ RPC Enabled Nodes: {}", nodes.join(""), @@ -774,7 +774,7 @@ impl ClusterInfo { }; let ip_addr = node.gossip.ip(); Some(format!( - "{:15} {:2}| {:5} | {:44} |{:^9}| {:5}| {:5}| {:5}| {:5}| {:5}| {:5}| {:5}| {:5}| {}\n", + "{:15} {:2}| {:5} | {:44} |{:^9}| {:5}| {:5}| {:5}| {:5}| {:5}| {:5}| {:5}| {:5}| {}\n", if ContactInfo::is_valid_address(&node.gossip, &self.socket_addr_space) { ip_addr.to_string() } else { @@ -805,8 +805,8 @@ impl ClusterInfo { format!( "IP Address |Age(ms)| Node identifier \ | Version |Gossip|TPUvote| TPU |TPUfwd| TVU |TVUfwd|Repair|ServeR|ShredVer\n\ - ------------------+-------+----------------------------------------------+---------+\ - ------+------+-------+------+------+------+------+------+--------\n\ + ------------------+-------+----------------------------------------------\ + +---------+------+-------+------+------+------+------+------+------+--------\n\ {}\ Nodes: {}{}{}", nodes.join(""), @@ -3064,6 +3064,7 @@ mod tests { itertools::izip, rand::{seq::SliceRandom, SeedableRng}, rand_chacha::ChaChaRng, + regex::Regex, solana_ledger::shred::Shredder, solana_net_utils::MINIMUM_VALIDATOR_PORT_RANGE_WIDTH, solana_sdk::signature::{Keypair, Signer}, @@ -3094,6 +3095,91 @@ mod tests { )); } + #[test] + fn test_cluster_info_trace() { + solana_logger::setup(); + let keypair = Keypair::from_base58_string("3jATNWfbii1btv6nCpToAXAJz6a4km5HsLSWiwLfNvHNQAmvksLFVAKGUz286bXb9N4ivXx8nuwkn91PFDTyoFEp"); + + let node = { + let tpu = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8900); + let _tpu_quic = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8901); + + let gossip = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8888); + let tvu = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8902); + let tvu_forwards = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8903); + let tpu_forwards = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8904); + + let tpu_vote = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8906); + let repair = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8907); + let rpc = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8908); + let rpc_pubsub = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8909); + + let serve_repair = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8910); + + let info = ContactInfo { + id: keypair.pubkey(), + gossip, + tvu, + tvu_forwards, + repair, + tpu, + tpu_forwards, + tpu_vote, + rpc, + rpc_pubsub, + serve_repair, + wallclock: timestamp(), + shred_version: 0, + }; + Node { + info, + sockets: Sockets { + gossip: UdpSocket::bind("0.0.0.0:0").unwrap(), + ip_echo: None, + tvu: vec![], + tvu_forwards: vec![], + tpu: vec![], + tpu_forwards: vec![], + tpu_vote: vec![], + broadcast: vec![], + repair: UdpSocket::bind("0.0.0.0:0").unwrap(), + retransmit_sockets: vec![], + serve_repair: UdpSocket::bind("0.0.0.0:0").unwrap(), + ancestor_hashes_requests: UdpSocket::bind("0.0.0.0:0").unwrap(), + tpu_quic: UdpSocket::bind("0.0.0.0:0").unwrap(), + tpu_forwards_quic: UdpSocket::bind("0.0.0.0:0").unwrap(), + }, + } + }; + + let cluster_info = Arc::new(ClusterInfo::new( + node.info, + Arc::new(keypair), + SocketAddrSpace::Unspecified, + )); + + let golden = r#" +IP Address |Age(ms)| Node identifier | Version |Gossip|TPUvote| TPU |TPUfwd| TVU |TVUfwd|Repair|ServeR|ShredVer +------------------+-------+----------------------------------------------+---------+------+-------+------+------+------+------+------+------+-------- +127.0.0.1 me| \d | 7fGBVaezz2YrTxAkwvLjBZpxrGEfNsd14Jxw9W5Df5zY | - | 8888 | 8906 | 8900 | 8904 | 8902 | 8903 | 8907 | 8910 | 0 +Nodes: 1 + +RPC Address |Age(ms)| Node identifier | Version | RPC |PubSub|ShredVer +------------------+-------+----------------------------------------------+---------+------+------+-------- +127.0.0.1 me| \d | 7fGBVaezz2YrTxAkwvLjBZpxrGEfNsd14Jxw9W5Df5zY | - | 8908 | 8909 | 0 +RPC Enabled Nodes: 1"#; + + let re = Regex::new(golden).unwrap(); + + let output = format!( + "\n{}\n\n{}", + cluster_info.contact_info_trace(), + cluster_info.rpc_info_trace() + ); + + assert!(re.is_match(&output)); + } + #[test] fn test_handle_pull() { solana_logger::setup();