From b1b190b80d10f055672fbd95cb6cff95dfb1ee14 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 12 Dec 2018 20:57:48 -0600 Subject: [PATCH] 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 --- src/cluster_info.rs | 2 +- src/fullnode.rs | 65 +++++++++++++++++++++++++++------------------ src/tvu.rs | 46 +++++++++++++++++++++----------- 3 files changed, 70 insertions(+), 43 deletions(-) diff --git a/src/cluster_info.rs b/src/cluster_info.rs index 5a7694c15f..b65e3a3fa6 100644 --- a/src/cluster_info.rs +++ b/src/cluster_info.rs @@ -63,7 +63,7 @@ pub struct ClusterInfo { /// The network pub gossip: CrdsGossip, /// set the keypair that will be used to sign crds values generated. It is unset only in tests. - keypair: Arc, + pub(crate) keypair: Arc, } #[derive(Debug, Deserialize, Serialize)] diff --git a/src/fullnode.rs b/src/fullnode.rs index 19eda84f29..f6a2ea0b5f 100644 --- a/src/fullnode.rs +++ b/src/fullnode.rs @@ -13,7 +13,7 @@ use crate::rpc_pubsub::PubSubService; use crate::service::Service; use crate::tpu::{Tpu, TpuReturnType}; use crate::tpu_forwarder::TpuForwarder; -use crate::tvu::{Tvu, TvuReturnType}; +use crate::tvu::{Sockets, Tvu, TvuReturnType}; use crate::window::{new_window, SharedWindow}; use log::Level; use solana_sdk::hash::Hash; @@ -271,26 +271,33 @@ impl Fullnode { let node_role = if scheduled_leader != keypair.pubkey() { // 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( - keypair.clone(), + // keypair.clone(), vote_account_keypair.clone(), &bank, entry_height, *last_entry_id, cluster_info.clone(), - node.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"), + sockets, Some(ledger_path), db_ledger.clone(), ); @@ -432,23 +439,29 @@ impl Fullnode { self.validator_to_leader(tick_height, entry_height, last_entry_id); Ok(()) } 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( - self.keypair.clone(), self.vote_account_keypair.clone(), &self.bank, entry_height, last_entry_id, self.cluster_info.clone(), - self.tvu_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"), + sockets, Some(&self.ledger_path), self.db_ledger.clone(), ); diff --git a/src/tvu.rs b/src/tvu.rs index 6fa003b084..f52cd4e6e9 100644 --- a/src/tvu.rs +++ b/src/tvu.rs @@ -44,35 +44,46 @@ pub struct Tvu { exit: Arc, } +pub struct Sockets { + pub fetch: Vec, + pub repair: UdpSocket, + pub retransmit: UdpSocket, +} + impl Tvu { /// This service receives messages from a leader in the network and processes the transactions /// on the bank state. /// # Arguments - /// * `bank` - The bank state. - /// * `keypair` - Node's key pair for signing /// * `vote_account_keypair` - Vote key pair + /// * `bank` - The bank state. /// * `entry_height` - Initial ledger height + /// * `last_entry_id` - Hash of the last entry /// * `cluster_info` - The cluster_info state. - /// * `window` - The window state. - /// * `fetch_sockets` - my fetch sockets - /// * `repair_socket` - my repair socket - /// * `retransmit_socket` - my retransmit socket + /// * `sockets` - My fetch, repair, and restransmit sockets /// * `ledger_path` - path to the ledger file - #[allow(clippy::too_many_arguments)] + /// * `db_ledger` - the ledger itself pub fn new( - keypair: Arc, vote_account_keypair: Arc, bank: &Arc, entry_height: u64, last_entry_id: Hash, cluster_info: Arc>, - fetch_sockets: Vec, - repair_socket: UdpSocket, - retransmit_socket: UdpSocket, + sockets: Sockets, ledger_path: Option<&str>, db_ledger: Arc>, ) -> Self { let exit = Arc::new(AtomicBool::new(false)); + let keypair: Arc = 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 mut blob_sockets: Vec> = @@ -179,7 +190,7 @@ pub mod tests { use crate::packet::SharedBlob; use crate::service::Service; use crate::streamer; - use crate::tvu::Tvu; + use crate::tvu::{Sockets, Tvu}; use crate::window::{self, SharedWindow}; use bincode::serialize; use rocksdb::{Options, DB}; @@ -270,15 +281,18 @@ pub mod tests { let db_ledger = DbLedger::open(&db_ledger_path).expect("Expected to successfully open ledger"); let tvu = Tvu::new( - Arc::new(target1_keypair), vote_account_keypair, &bank, 0, cur_hash, cref1, - target1.sockets.tvu, - target1.sockets.repair, - target1.sockets.retransmit, + { + Sockets { + repair: target1.sockets.repair, + retransmit: target1.sockets.retransmit, + fetch: target1.sockets.tvu, + } + }, None, Arc::new(RwLock::new(db_ledger)), );