diff --git a/core/src/gossip_service.rs b/core/src/gossip_service.rs index 3e2c824e6a..eb03b74980 100644 --- a/core/src/gossip_service.rs +++ b/core/src/gossip_service.rs @@ -52,7 +52,7 @@ impl GossipService { pub fn discover( entry_point_info: &NodeInfo, num_nodes: usize, -) -> Result<(Option, Vec), &'static str> { +) -> std::io::Result<(Option, Vec)> { let exit = Arc::new(AtomicBool::new(false)); let (gossip_service, spy_ref) = make_spy_node(entry_point_info, &exit); let id = spy_ref.read().unwrap().keypair.pubkey(); @@ -97,10 +97,13 @@ pub fn discover( "discover failed...\n{}", spy_ref.read().unwrap().node_info_trace() ); - Err("Failed to converge") + Err(std::io::Error::new( + std::io::ErrorKind::Other, + "Failed to converge", + )) } -pub fn make_spy_node( +fn make_spy_node( entry_point: &NodeInfo, exit: &Arc, ) -> (GossipService, Arc>) { diff --git a/core/src/replicator.rs b/core/src/replicator.rs index cc8019dd7f..bf36306ed6 100644 --- a/core/src/replicator.rs +++ b/core/src/replicator.rs @@ -11,7 +11,7 @@ use crate::rpc_request::{RpcClient, RpcRequest, RpcRequestHandler}; use crate::service::Service; use crate::storage_stage::{get_segment_from_entry, ENTRIES_PER_SEGMENT}; use crate::streamer::BlobReceiver; -use crate::thin_client::{poll_gossip_for_leader, retry_get_balance, ThinClient}; +use crate::thin_client::{retry_get_balance, ThinClient}; use crate::window_service::WindowService; use rand::thread_rng; use rand::Rng; @@ -111,7 +111,7 @@ impl Replicator { node: Node, leader_info: &NodeInfo, keypair: &Arc, - timeout: Option, + _timeout: Option, ) -> Result { let exit = Arc::new(AtomicBool::new(false)); @@ -148,13 +148,8 @@ impl Replicator { &exit, ); - info!("polling for leader"); - - let leader = poll_gossip_for_leader( - leader_info.gossip, - timeout.unwrap_or_else(|| Duration::new(30, 0)), - )?; - info!("Got leader: {:?}", leader); + info!("Looking for leader at {:?}", leader_info); + crate::gossip_service::discover(&leader_info, 1)?; let (storage_blockhash, storage_entry_height) = Self::poll_for_blockhash_and_entry_height(&cluster_info)?; @@ -210,7 +205,7 @@ impl Replicator { cluster_info_w.insert_info(node_info); } - let mut client = mk_client(&leader); + let mut client = mk_client(leader_info); Self::get_airdrop_lamports(&mut client, &keypair, &leader_info); info!("Done downloading ledger at {}", ledger_path); diff --git a/core/src/thin_client.rs b/core/src/thin_client.rs index f7877ab28e..f1ca910a8c 100644 --- a/core/src/thin_client.rs +++ b/core/src/thin_client.rs @@ -3,13 +3,10 @@ //! messages to the network directly. The binary encoding of its messages are //! unstable and may change in future releases. -use crate::cluster_info::{ClusterInfoError, NodeInfo}; +use crate::cluster_info::NodeInfo; use crate::fullnode::{Fullnode, FullnodeConfig}; -use crate::gossip_service::make_spy_node; use crate::packet::PACKET_DATA_SIZE; -use crate::result::{Error, Result}; use crate::rpc_request::{RpcClient, RpcRequest, RpcRequestHandler}; -use crate::service::Service; use bincode::serialize_into; use bs58; use serde_json; @@ -25,7 +22,6 @@ use solana_sdk::transaction::Transaction; use std; use std::io; use std::net::{SocketAddr, UdpSocket}; -use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::thread::sleep; use std::time::Duration; @@ -390,38 +386,6 @@ impl Drop for ThinClient { } } -pub fn poll_gossip_for_leader(gossip_addr: SocketAddr, timeout: Duration) -> Result { - let exit = Arc::new(AtomicBool::new(false)); - let entry_point = NodeInfo::new_entry_point(&gossip_addr); - let (gossip_service, cluster_info) = make_spy_node(&entry_point, &exit); - - let now = Instant::now(); - let result = loop { - sleep(Duration::from_millis(100)); - trace!("polling {:?} for leader", gossip_addr); - - if let Some(leader) = cluster_info.read().unwrap().get_gossip_top_leader() { - if log_enabled!(log::Level::Trace) { - trace!("{}", cluster_info.read().unwrap().node_info_trace()); - } - break Ok(leader.clone()); - } - - if log_enabled!(log::Level::Trace) { - trace!("{}", cluster_info.read().unwrap().node_info_trace()); - } - - if now.elapsed() > timeout { - break Err(Error::ClusterInfoError(ClusterInfoError::NoLeader)); - } - }; - - exit.store(true, Ordering::Relaxed); - gossip_service.join()?; - - result -} - pub fn retry_get_balance( client: &mut ThinClient, bob_pubkey: &Pubkey, @@ -479,6 +443,7 @@ pub fn new_fullnode() -> (Fullnode, NodeInfo, Keypair, String) { mod tests { use super::*; use crate::client::mk_client; + use crate::gossip_service::discover; use bincode::{deserialize, serialize}; use solana_sdk::system_instruction::SystemInstruction; use solana_vote_api::vote_state::VoteState; @@ -490,11 +455,7 @@ mod tests { solana_logger::setup(); let (server, leader_data, alice, ledger_path) = new_fullnode(); let bob_pubkey = Keypair::new().pubkey(); - - info!( - "found leader: {:?}", - poll_gossip_for_leader(leader_data.gossip, Duration::from_secs(5)).unwrap() - ); + discover(&leader_data, 1).unwrap(); let mut client = mk_client(&leader_data); @@ -525,10 +486,7 @@ mod tests { solana_logger::setup(); let (server, leader_data, alice, ledger_path) = new_fullnode(); let bob_pubkey = Keypair::new().pubkey(); - info!( - "found leader: {:?}", - poll_gossip_for_leader(leader_data.gossip, Duration::from_secs(5)).unwrap() - ); + discover(&leader_data, 1).unwrap(); let mut client = mk_client(&leader_data); @@ -559,10 +517,7 @@ mod tests { fn test_register_vote_account() { solana_logger::setup(); let (server, leader_data, alice, ledger_path) = new_fullnode(); - info!( - "found leader: {:?}", - poll_gossip_for_leader(leader_data.gossip, Duration::from_secs(5)).unwrap() - ); + discover(&leader_data, 1).unwrap(); let mut client = mk_client(&leader_data); @@ -628,11 +583,7 @@ mod tests { solana_logger::setup(); let (server, leader_data, alice, ledger_path) = new_fullnode(); let bob_keypair = Keypair::new(); - - info!( - "found leader: {:?}", - poll_gossip_for_leader(leader_data.gossip, Duration::from_secs(5)).unwrap() - ); + discover(&leader_data, 1).unwrap(); let mut client = mk_client(&leader_data); let blockhash = client.get_recent_blockhash(); diff --git a/tests/replicator.rs b/tests/replicator.rs index 6f90009f7c..60244950ed 100644 --- a/tests/replicator.rs +++ b/tests/replicator.rs @@ -61,11 +61,8 @@ fn test_replicator_startup_basic() { &fullnode_config, ); - debug!( - "leader: {:?}", - solana::thin_client::poll_gossip_for_leader(leader_info.gossip, Duration::from_secs(5)) - .unwrap() - ); + debug!("Looking for leader on gossip..."); + solana::gossip_service::discover(&leader_info, 1).unwrap(); let validator_keypair = Arc::new(Keypair::new()); let voting_keypair = Keypair::new();