Fix too many args in Tvu::new (#2114)

* Reduce args in Tvu::new under to 8

Now pass in sockets through a the crate::tvu::Sockets struct

Move ClusterInfo.keypair to pub(crate) in order to remove redundant
signing keypair parameter

* remove commented code
This commit is contained in:
Mark 2018-12-12 20:57:48 -06:00 committed by Rob Walker
parent 3408ce89a7
commit b1b190b80d
3 changed files with 70 additions and 43 deletions

View File

@ -63,7 +63,7 @@ pub struct ClusterInfo {
/// The network /// The network
pub gossip: CrdsGossip, pub gossip: CrdsGossip,
/// set the keypair that will be used to sign crds values generated. It is unset only in tests. /// set the keypair that will be used to sign crds values generated. It is unset only in tests.
keypair: Arc<Keypair>, pub(crate) keypair: Arc<Keypair>,
} }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]

View File

@ -13,7 +13,7 @@ use crate::rpc_pubsub::PubSubService;
use crate::service::Service; use crate::service::Service;
use crate::tpu::{Tpu, TpuReturnType}; use crate::tpu::{Tpu, TpuReturnType};
use crate::tpu_forwarder::TpuForwarder; use crate::tpu_forwarder::TpuForwarder;
use crate::tvu::{Tvu, TvuReturnType}; use crate::tvu::{Sockets, Tvu, TvuReturnType};
use crate::window::{new_window, SharedWindow}; use crate::window::{new_window, SharedWindow};
use log::Level; use log::Level;
use solana_sdk::hash::Hash; use solana_sdk::hash::Hash;
@ -271,26 +271,33 @@ impl Fullnode {
let node_role = if scheduled_leader != keypair.pubkey() { let node_role = if scheduled_leader != keypair.pubkey() {
// Start in validator mode. // Start in validator mode.
let sockets = Sockets {
repair: node
.sockets
.repair
.try_clone()
.expect("Failed to clone repair socket"),
retransmit: node
.sockets
.retransmit
.try_clone()
.expect("Failed to clone retransmit socket"),
fetch: node
.sockets
.tvu
.iter()
.map(|s| s.try_clone().expect("Failed to clone TVU Sockets"))
.collect(),
};
let tvu = Tvu::new( let tvu = Tvu::new(
keypair.clone(), // keypair.clone(),
vote_account_keypair.clone(), vote_account_keypair.clone(),
&bank, &bank,
entry_height, entry_height,
*last_entry_id, *last_entry_id,
cluster_info.clone(), cluster_info.clone(),
node.sockets sockets,
.tvu
.iter()
.map(|s| s.try_clone().expect("Failed to clone TVU sockets"))
.collect(),
node.sockets
.repair
.try_clone()
.expect("Failed to clone repair socket"),
node.sockets
.retransmit
.try_clone()
.expect("Failed to clone retransmit socket"),
Some(ledger_path), Some(ledger_path),
db_ledger.clone(), db_ledger.clone(),
); );
@ -432,23 +439,29 @@ impl Fullnode {
self.validator_to_leader(tick_height, entry_height, last_entry_id); self.validator_to_leader(tick_height, entry_height, last_entry_id);
Ok(()) Ok(())
} else { } else {
let sockets = Sockets {
repair: self
.repair_socket
.try_clone()
.expect("Failed to clone repair socket"),
retransmit: self
.retransmit_socket
.try_clone()
.expect("Failed to clone retransmit socket"),
fetch: self
.tvu_sockets
.iter()
.map(|s| s.try_clone().expect("Failed to clone TVU Sockets"))
.collect(),
};
let tvu = Tvu::new( let tvu = Tvu::new(
self.keypair.clone(),
self.vote_account_keypair.clone(), self.vote_account_keypair.clone(),
&self.bank, &self.bank,
entry_height, entry_height,
last_entry_id, last_entry_id,
self.cluster_info.clone(), self.cluster_info.clone(),
self.tvu_sockets sockets,
.iter()
.map(|s| s.try_clone().expect("Failed to clone TVU sockets"))
.collect(),
self.repair_socket
.try_clone()
.expect("Failed to clone repair socket"),
self.retransmit_socket
.try_clone()
.expect("Failed to clone retransmit socket"),
Some(&self.ledger_path), Some(&self.ledger_path),
self.db_ledger.clone(), self.db_ledger.clone(),
); );

View File

@ -44,35 +44,46 @@ pub struct Tvu {
exit: Arc<AtomicBool>, exit: Arc<AtomicBool>,
} }
pub struct Sockets {
pub fetch: Vec<UdpSocket>,
pub repair: UdpSocket,
pub retransmit: UdpSocket,
}
impl Tvu { impl Tvu {
/// This service receives messages from a leader in the network and processes the transactions /// This service receives messages from a leader in the network and processes the transactions
/// on the bank state. /// on the bank state.
/// # Arguments /// # Arguments
/// * `bank` - The bank state.
/// * `keypair` - Node's key pair for signing
/// * `vote_account_keypair` - Vote key pair /// * `vote_account_keypair` - Vote key pair
/// * `bank` - The bank state.
/// * `entry_height` - Initial ledger height /// * `entry_height` - Initial ledger height
/// * `last_entry_id` - Hash of the last entry
/// * `cluster_info` - The cluster_info state. /// * `cluster_info` - The cluster_info state.
/// * `window` - The window state. /// * `sockets` - My fetch, repair, and restransmit sockets
/// * `fetch_sockets` - my fetch sockets
/// * `repair_socket` - my repair socket
/// * `retransmit_socket` - my retransmit socket
/// * `ledger_path` - path to the ledger file /// * `ledger_path` - path to the ledger file
#[allow(clippy::too_many_arguments)] /// * `db_ledger` - the ledger itself
pub fn new( pub fn new(
keypair: Arc<Keypair>,
vote_account_keypair: Arc<Keypair>, vote_account_keypair: Arc<Keypair>,
bank: &Arc<Bank>, bank: &Arc<Bank>,
entry_height: u64, entry_height: u64,
last_entry_id: Hash, last_entry_id: Hash,
cluster_info: Arc<RwLock<ClusterInfo>>, cluster_info: Arc<RwLock<ClusterInfo>>,
fetch_sockets: Vec<UdpSocket>, sockets: Sockets,
repair_socket: UdpSocket,
retransmit_socket: UdpSocket,
ledger_path: Option<&str>, ledger_path: Option<&str>,
db_ledger: Arc<RwLock<DbLedger>>, db_ledger: Arc<RwLock<DbLedger>>,
) -> Self { ) -> Self {
let exit = Arc::new(AtomicBool::new(false)); let exit = Arc::new(AtomicBool::new(false));
let keypair: Arc<Keypair> = cluster_info
.read()
.expect("Unable to read from cluster_info during Tvu creation")
.keypair
.clone();
let Sockets {
repair: repair_socket,
fetch: fetch_sockets,
retransmit: retransmit_socket,
} = sockets;
let repair_socket = Arc::new(repair_socket); let repair_socket = Arc::new(repair_socket);
let mut blob_sockets: Vec<Arc<UdpSocket>> = let mut blob_sockets: Vec<Arc<UdpSocket>> =
@ -179,7 +190,7 @@ pub mod tests {
use crate::packet::SharedBlob; use crate::packet::SharedBlob;
use crate::service::Service; use crate::service::Service;
use crate::streamer; use crate::streamer;
use crate::tvu::Tvu; use crate::tvu::{Sockets, Tvu};
use crate::window::{self, SharedWindow}; use crate::window::{self, SharedWindow};
use bincode::serialize; use bincode::serialize;
use rocksdb::{Options, DB}; use rocksdb::{Options, DB};
@ -270,15 +281,18 @@ pub mod tests {
let db_ledger = let db_ledger =
DbLedger::open(&db_ledger_path).expect("Expected to successfully open ledger"); DbLedger::open(&db_ledger_path).expect("Expected to successfully open ledger");
let tvu = Tvu::new( let tvu = Tvu::new(
Arc::new(target1_keypair),
vote_account_keypair, vote_account_keypair,
&bank, &bank,
0, 0,
cur_hash, cur_hash,
cref1, cref1,
target1.sockets.tvu, {
target1.sockets.repair, Sockets {
target1.sockets.retransmit, repair: target1.sockets.repair,
retransmit: target1.sockets.retransmit,
fetch: target1.sockets.tvu,
}
},
None, None,
Arc::new(RwLock::new(db_ledger)), Arc::new(RwLock::new(db_ledger)),
); );