Remove poll_gossip_for_leader()

This commit is contained in:
Michael Vines 2019-03-08 10:20:37 -08:00
parent 12f3fd75e8
commit e18673953c
4 changed files with 19 additions and 73 deletions

View File

@ -52,7 +52,7 @@ impl GossipService {
pub fn discover(
entry_point_info: &NodeInfo,
num_nodes: usize,
) -> Result<(Option<NodeInfo>, Vec<NodeInfo>), &'static str> {
) -> std::io::Result<(Option<NodeInfo>, Vec<NodeInfo>)> {
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<AtomicBool>,
) -> (GossipService, Arc<RwLock<ClusterInfo>>) {

View File

@ -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<Keypair>,
timeout: Option<Duration>,
_timeout: Option<Duration>,
) -> Result<Self> {
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);

View File

@ -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<NodeInfo> {
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();

View File

@ -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();