Remove poll_gossip_for_leader()
This commit is contained in:
@ -52,7 +52,7 @@ impl GossipService {
|
|||||||
pub fn discover(
|
pub fn discover(
|
||||||
entry_point_info: &NodeInfo,
|
entry_point_info: &NodeInfo,
|
||||||
num_nodes: usize,
|
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 exit = Arc::new(AtomicBool::new(false));
|
||||||
let (gossip_service, spy_ref) = make_spy_node(entry_point_info, &exit);
|
let (gossip_service, spy_ref) = make_spy_node(entry_point_info, &exit);
|
||||||
let id = spy_ref.read().unwrap().keypair.pubkey();
|
let id = spy_ref.read().unwrap().keypair.pubkey();
|
||||||
@ -97,10 +97,13 @@ pub fn discover(
|
|||||||
"discover failed...\n{}",
|
"discover failed...\n{}",
|
||||||
spy_ref.read().unwrap().node_info_trace()
|
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,
|
entry_point: &NodeInfo,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
) -> (GossipService, Arc<RwLock<ClusterInfo>>) {
|
) -> (GossipService, Arc<RwLock<ClusterInfo>>) {
|
||||||
|
@ -11,7 +11,7 @@ use crate::rpc_request::{RpcClient, RpcRequest, RpcRequestHandler};
|
|||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use crate::storage_stage::{get_segment_from_entry, ENTRIES_PER_SEGMENT};
|
use crate::storage_stage::{get_segment_from_entry, ENTRIES_PER_SEGMENT};
|
||||||
use crate::streamer::BlobReceiver;
|
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 crate::window_service::WindowService;
|
||||||
use rand::thread_rng;
|
use rand::thread_rng;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
@ -111,7 +111,7 @@ impl Replicator {
|
|||||||
node: Node,
|
node: Node,
|
||||||
leader_info: &NodeInfo,
|
leader_info: &NodeInfo,
|
||||||
keypair: &Arc<Keypair>,
|
keypair: &Arc<Keypair>,
|
||||||
timeout: Option<Duration>,
|
_timeout: Option<Duration>,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
let exit = Arc::new(AtomicBool::new(false));
|
let exit = Arc::new(AtomicBool::new(false));
|
||||||
|
|
||||||
@ -148,13 +148,8 @@ impl Replicator {
|
|||||||
&exit,
|
&exit,
|
||||||
);
|
);
|
||||||
|
|
||||||
info!("polling for leader");
|
info!("Looking for leader at {:?}", leader_info);
|
||||||
|
crate::gossip_service::discover(&leader_info, 1)?;
|
||||||
let leader = poll_gossip_for_leader(
|
|
||||||
leader_info.gossip,
|
|
||||||
timeout.unwrap_or_else(|| Duration::new(30, 0)),
|
|
||||||
)?;
|
|
||||||
info!("Got leader: {:?}", leader);
|
|
||||||
|
|
||||||
let (storage_blockhash, storage_entry_height) =
|
let (storage_blockhash, storage_entry_height) =
|
||||||
Self::poll_for_blockhash_and_entry_height(&cluster_info)?;
|
Self::poll_for_blockhash_and_entry_height(&cluster_info)?;
|
||||||
@ -210,7 +205,7 @@ impl Replicator {
|
|||||||
cluster_info_w.insert_info(node_info);
|
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);
|
Self::get_airdrop_lamports(&mut client, &keypair, &leader_info);
|
||||||
info!("Done downloading ledger at {}", ledger_path);
|
info!("Done downloading ledger at {}", ledger_path);
|
||||||
|
@ -3,13 +3,10 @@
|
|||||||
//! messages to the network directly. The binary encoding of its messages are
|
//! messages to the network directly. The binary encoding of its messages are
|
||||||
//! unstable and may change in future releases.
|
//! 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::fullnode::{Fullnode, FullnodeConfig};
|
||||||
use crate::gossip_service::make_spy_node;
|
|
||||||
use crate::packet::PACKET_DATA_SIZE;
|
use crate::packet::PACKET_DATA_SIZE;
|
||||||
use crate::result::{Error, Result};
|
|
||||||
use crate::rpc_request::{RpcClient, RpcRequest, RpcRequestHandler};
|
use crate::rpc_request::{RpcClient, RpcRequest, RpcRequestHandler};
|
||||||
use crate::service::Service;
|
|
||||||
use bincode::serialize_into;
|
use bincode::serialize_into;
|
||||||
use bs58;
|
use bs58;
|
||||||
use serde_json;
|
use serde_json;
|
||||||
@ -25,7 +22,6 @@ use solana_sdk::transaction::Transaction;
|
|||||||
use std;
|
use std;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::net::{SocketAddr, UdpSocket};
|
use std::net::{SocketAddr, UdpSocket};
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
use std::time::Duration;
|
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(
|
pub fn retry_get_balance(
|
||||||
client: &mut ThinClient,
|
client: &mut ThinClient,
|
||||||
bob_pubkey: &Pubkey,
|
bob_pubkey: &Pubkey,
|
||||||
@ -479,6 +443,7 @@ pub fn new_fullnode() -> (Fullnode, NodeInfo, Keypair, String) {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::client::mk_client;
|
use crate::client::mk_client;
|
||||||
|
use crate::gossip_service::discover;
|
||||||
use bincode::{deserialize, serialize};
|
use bincode::{deserialize, serialize};
|
||||||
use solana_sdk::system_instruction::SystemInstruction;
|
use solana_sdk::system_instruction::SystemInstruction;
|
||||||
use solana_vote_api::vote_state::VoteState;
|
use solana_vote_api::vote_state::VoteState;
|
||||||
@ -490,11 +455,7 @@ mod tests {
|
|||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
let (server, leader_data, alice, ledger_path) = new_fullnode();
|
let (server, leader_data, alice, ledger_path) = new_fullnode();
|
||||||
let bob_pubkey = Keypair::new().pubkey();
|
let bob_pubkey = Keypair::new().pubkey();
|
||||||
|
discover(&leader_data, 1).unwrap();
|
||||||
info!(
|
|
||||||
"found leader: {:?}",
|
|
||||||
poll_gossip_for_leader(leader_data.gossip, Duration::from_secs(5)).unwrap()
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut client = mk_client(&leader_data);
|
let mut client = mk_client(&leader_data);
|
||||||
|
|
||||||
@ -525,10 +486,7 @@ mod tests {
|
|||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
let (server, leader_data, alice, ledger_path) = new_fullnode();
|
let (server, leader_data, alice, ledger_path) = new_fullnode();
|
||||||
let bob_pubkey = Keypair::new().pubkey();
|
let bob_pubkey = Keypair::new().pubkey();
|
||||||
info!(
|
discover(&leader_data, 1).unwrap();
|
||||||
"found leader: {:?}",
|
|
||||||
poll_gossip_for_leader(leader_data.gossip, Duration::from_secs(5)).unwrap()
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut client = mk_client(&leader_data);
|
let mut client = mk_client(&leader_data);
|
||||||
|
|
||||||
@ -559,10 +517,7 @@ mod tests {
|
|||||||
fn test_register_vote_account() {
|
fn test_register_vote_account() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
let (server, leader_data, alice, ledger_path) = new_fullnode();
|
let (server, leader_data, alice, ledger_path) = new_fullnode();
|
||||||
info!(
|
discover(&leader_data, 1).unwrap();
|
||||||
"found leader: {:?}",
|
|
||||||
poll_gossip_for_leader(leader_data.gossip, Duration::from_secs(5)).unwrap()
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut client = mk_client(&leader_data);
|
let mut client = mk_client(&leader_data);
|
||||||
|
|
||||||
@ -628,11 +583,7 @@ mod tests {
|
|||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
let (server, leader_data, alice, ledger_path) = new_fullnode();
|
let (server, leader_data, alice, ledger_path) = new_fullnode();
|
||||||
let bob_keypair = Keypair::new();
|
let bob_keypair = Keypair::new();
|
||||||
|
discover(&leader_data, 1).unwrap();
|
||||||
info!(
|
|
||||||
"found leader: {:?}",
|
|
||||||
poll_gossip_for_leader(leader_data.gossip, Duration::from_secs(5)).unwrap()
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut client = mk_client(&leader_data);
|
let mut client = mk_client(&leader_data);
|
||||||
let blockhash = client.get_recent_blockhash();
|
let blockhash = client.get_recent_blockhash();
|
||||||
|
@ -61,11 +61,8 @@ fn test_replicator_startup_basic() {
|
|||||||
&fullnode_config,
|
&fullnode_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
debug!(
|
debug!("Looking for leader on gossip...");
|
||||||
"leader: {:?}",
|
solana::gossip_service::discover(&leader_info, 1).unwrap();
|
||||||
solana::thin_client::poll_gossip_for_leader(leader_info.gossip, Duration::from_secs(5))
|
|
||||||
.unwrap()
|
|
||||||
);
|
|
||||||
|
|
||||||
let validator_keypair = Arc::new(Keypair::new());
|
let validator_keypair = Arc::new(Keypair::new());
|
||||||
let voting_keypair = Keypair::new();
|
let voting_keypair = Keypair::new();
|
||||||
|
Reference in New Issue
Block a user