Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions core/src/gossip_service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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>>) {
Expand Down
15 changes: 5 additions & 10 deletions core/src/replicator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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));

Expand Down Expand Up @@ -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)?;
Expand Down Expand Up @@ -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);
Expand Down
61 changes: 6 additions & 55 deletions core/src/thin_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand All @@ -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);

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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();
Expand Down
7 changes: 2 additions & 5 deletions tests/replicator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down