serve_repair: Remove internal ContactInfo field duplication

This commit is contained in:
Michael Vines 2021-06-21 09:29:23 -07:00
parent 0ab361b828
commit 51a0007001
2 changed files with 20 additions and 38 deletions

View File

@ -19,12 +19,7 @@ use solana_ledger::{
use solana_measure::measure::Measure; use solana_measure::measure::Measure;
use solana_metrics::inc_new_counter_debug; use solana_metrics::inc_new_counter_debug;
use solana_perf::packet::{limited_deserialize, Packets, PacketsRecycler}; use solana_perf::packet::{limited_deserialize, Packets, PacketsRecycler};
use solana_sdk::{ use solana_sdk::{clock::Slot, pubkey::Pubkey, timing::duration_as_ms};
clock::Slot,
pubkey::Pubkey,
signature::{Keypair, Signer},
timing::duration_as_ms,
};
use solana_streamer::streamer::{PacketReceiver, PacketSender}; use solana_streamer::streamer::{PacketReceiver, PacketSender};
use std::{ use std::{
collections::{hash_map::Entry, HashMap, HashSet}, collections::{hash_map::Entry, HashMap, HashSet},
@ -101,9 +96,6 @@ pub enum RepairProtocol {
#[derive(Clone)] #[derive(Clone)]
pub struct ServeRepair { pub struct ServeRepair {
/// set the keypair that will be used to sign repair responses
keypair: Arc<Keypair>,
my_info: ContactInfo,
cluster_info: Arc<ClusterInfo>, cluster_info: Arc<ClusterInfo>,
} }
@ -118,20 +110,15 @@ impl ServeRepair {
} }
pub fn new(cluster_info: Arc<ClusterInfo>) -> Self { pub fn new(cluster_info: Arc<ClusterInfo>) -> Self {
let (keypair, my_info) = { (cluster_info.keypair.clone(), cluster_info.my_contact_info()) }; Self { cluster_info }
Self {
keypair,
my_info,
cluster_info,
}
} }
pub fn my_info(&self) -> &ContactInfo { fn my_info(&self) -> ContactInfo {
&self.my_info self.cluster_info.my_contact_info()
} }
pub fn keypair(&self) -> &Arc<Keypair> { pub(crate) fn my_id(&self) -> Pubkey {
&self.keypair self.cluster_info.id()
} }
fn get_repair_sender(request: &RepairProtocol) -> &ContactInfo { fn get_repair_sender(request: &RepairProtocol) -> &ContactInfo {
@ -155,8 +142,8 @@ impl ServeRepair {
) -> Option<Packets> { ) -> Option<Packets> {
let now = Instant::now(); let now = Instant::now();
//TODO verify from is signed let my_id = me.read().unwrap().my_id();
let my_id = me.read().unwrap().keypair.pubkey(); //TODO: verify `from` is signed
let from = Self::get_repair_sender(&request); let from = Self::get_repair_sender(&request);
if from.id == my_id { if from.id == my_id {
stats.self_repair += 1; stats.self_repair += 1;
@ -173,7 +160,7 @@ impl ServeRepair {
from, from,
from_addr, from_addr,
blockstore, blockstore,
&me.read().unwrap().my_info, &my_id,
*slot, *slot,
*shred_index, *shred_index,
*nonce, *nonce,
@ -271,7 +258,7 @@ impl ServeRepair {
fn report_reset_stats(me: &Arc<RwLock<Self>>, stats: &mut ServeRepairStats) { fn report_reset_stats(me: &Arc<RwLock<Self>>, stats: &mut ServeRepairStats) {
if stats.self_repair > 0 { if stats.self_repair > 0 {
let my_id = me.read().unwrap().keypair.pubkey(); let my_id = me.read().unwrap().cluster_info.id();
warn!( warn!(
"{}: Ignored received repair requests from ME: {}", "{}: Ignored received repair requests from ME: {}",
my_id, stats.self_repair, my_id, stats.self_repair,
@ -368,8 +355,7 @@ impl ServeRepair {
shred_index: u64, shred_index: u64,
nonce: Nonce, nonce: Nonce,
) -> Result<Vec<u8>> { ) -> Result<Vec<u8>> {
let req = let req = RepairProtocol::WindowIndexWithNonce(self.my_info(), slot, shred_index, nonce);
RepairProtocol::WindowIndexWithNonce(self.my_info.clone(), slot, shred_index, nonce);
let out = serialize(&req)?; let out = serialize(&req)?;
Ok(out) Ok(out)
} }
@ -380,18 +366,14 @@ impl ServeRepair {
shred_index: u64, shred_index: u64,
nonce: Nonce, nonce: Nonce,
) -> Result<Vec<u8>> { ) -> Result<Vec<u8>> {
let req = RepairProtocol::HighestWindowIndexWithNonce( let req =
self.my_info.clone(), RepairProtocol::HighestWindowIndexWithNonce(self.my_info(), slot, shred_index, nonce);
slot,
shred_index,
nonce,
);
let out = serialize(&req)?; let out = serialize(&req)?;
Ok(out) Ok(out)
} }
fn orphan_bytes(&self, slot: Slot, nonce: Nonce) -> Result<Vec<u8>> { fn orphan_bytes(&self, slot: Slot, nonce: Nonce) -> Result<Vec<u8>> {
let req = RepairProtocol::OrphanWithNonce(self.my_info.clone(), slot, nonce); let req = RepairProtocol::OrphanWithNonce(self.my_info(), slot, nonce);
let out = serialize(&req)?; let out = serialize(&req)?;
Ok(out) Ok(out)
} }
@ -481,7 +463,7 @@ impl ServeRepair {
repair_validators repair_validators
.iter() .iter()
.filter_map(|key| { .filter_map(|key| {
if *key != self.my_info.id { if *key != self.my_id() {
self.cluster_info.lookup_contact_info(key, |ci| ci.clone()) self.cluster_info.lookup_contact_info(key, |ci| ci.clone())
} else { } else {
None None
@ -498,7 +480,7 @@ impl ServeRepair {
from: &ContactInfo, from: &ContactInfo,
from_addr: &SocketAddr, from_addr: &SocketAddr,
blockstore: Option<&Arc<Blockstore>>, blockstore: Option<&Arc<Blockstore>>,
me: &ContactInfo, my_id: &Pubkey,
slot: Slot, slot: Slot,
shred_index: u64, shred_index: u64,
nonce: Nonce, nonce: Nonce,
@ -526,7 +508,7 @@ impl ServeRepair {
inc_new_counter_debug!("serve_repair-window-request-fail", 1); inc_new_counter_debug!("serve_repair-window-request-fail", 1);
trace!( trace!(
"{}: failed WindowIndex {} {} {}", "{}: failed WindowIndex {} {} {}",
me.id, my_id,
from.id, from.id,
slot, slot,
shred_index, shred_index,
@ -721,7 +703,7 @@ mod tests {
&me, &me,
&socketaddr_any!(), &socketaddr_any!(),
Some(&blockstore), Some(&blockstore),
&me, &me.id,
slot, slot,
0, 0,
nonce, nonce,
@ -739,7 +721,7 @@ mod tests {
&me, &me,
&socketaddr_any!(), &socketaddr_any!(),
Some(&blockstore), Some(&blockstore),
&me, &me.id,
slot, slot,
index, index,
nonce, nonce,

View File

@ -23,7 +23,7 @@ impl ServeRepairService {
let serve_repair_socket = Arc::new(serve_repair_socket); let serve_repair_socket = Arc::new(serve_repair_socket);
trace!( trace!(
"ServeRepairService: id: {}, listening on: {:?}", "ServeRepairService: id: {}, listening on: {:?}",
&serve_repair.read().unwrap().my_info().id, &serve_repair.read().unwrap().my_id(),
serve_repair_socket.local_addr().unwrap() serve_repair_socket.local_addr().unwrap()
); );
let t_receiver = streamer::receiver( let t_receiver = streamer::receiver(