Don't grab keypair from cluster info on every iteration of broadccast (#6303)

This commit is contained in:
carllin 2019-10-09 17:36:45 -07:00 committed by GitHub
parent ed85aa43a4
commit 1f345ce2d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 21 deletions

View File

@ -45,14 +45,17 @@ impl BroadcastStageType {
blocktree: &Arc<Blocktree>,
) -> BroadcastStage {
match self {
BroadcastStageType::Standard => BroadcastStage::new(
sock,
cluster_info,
receiver,
exit_sender,
blocktree,
StandardBroadcastRun::new(),
),
BroadcastStageType::Standard => {
let keypair = cluster_info.read().unwrap().keypair.clone();
BroadcastStage::new(
sock,
cluster_info,
receiver,
exit_sender,
blocktree,
StandardBroadcastRun::new(keypair),
)
}
BroadcastStageType::FailEntryVerification => BroadcastStage::new(
sock,
@ -235,6 +238,7 @@ mod test {
let GenesisBlockInfo { genesis_block, .. } = create_genesis_block(10_000);
let bank = Arc::new(Bank::new(&genesis_block));
let leader_keypair = cluster_info.read().unwrap().keypair.clone();
// Start up the broadcast stage
let broadcast_service = BroadcastStage::new(
leader_info.sockets.broadcast,
@ -242,7 +246,7 @@ mod test {
entry_receiver,
&exit_sender,
&blocktree,
StandardBroadcastRun::new(),
StandardBroadcastRun::new(leader_keypair),
);
MockBroadcastStage {

View File

@ -32,15 +32,17 @@ pub(super) struct StandardBroadcastRun {
unfinished_slot: Option<UnfinishedSlotInfo>,
current_slot_and_parent: Option<(u64, u64)>,
slot_broadcast_start: Option<Instant>,
keypair: Arc<Keypair>,
}
impl StandardBroadcastRun {
pub(super) fn new() -> Self {
pub(super) fn new(keypair: Arc<Keypair>) -> Self {
Self {
stats: BroadcastStats::default(),
unfinished_slot: None,
current_slot_and_parent: None,
slot_broadcast_start: None,
keypair,
}
}
@ -98,12 +100,16 @@ impl StandardBroadcastRun {
&mut self,
blocktree: &Blocktree,
entries: &[Entry],
keypair: Arc<Keypair>,
is_slot_end: bool,
) -> (Vec<Shred>, Vec<Shred>) {
let (slot, parent_slot) = self.current_slot_and_parent.unwrap();
let shredder = Shredder::new(slot, parent_slot, RECOMMENDED_FEC_RATE, keypair)
.expect("Expected to create a new shredder");
let shredder = Shredder::new(
slot,
parent_slot,
RECOMMENDED_FEC_RATE,
self.keypair.clone(),
)
.expect("Expected to create a new shredder");
let next_shred_index = self
.unfinished_slot
@ -158,8 +164,6 @@ impl StandardBroadcastRun {
receive_elapsed = Duration::new(0, 0);
}
let keypair = cluster_info.read().unwrap().keypair.clone();
let to_shreds_start = Instant::now();
// 1) Check if slot was interrupted
@ -169,7 +173,6 @@ impl StandardBroadcastRun {
let (data_shreds, coding_shreds) = self.entries_to_shreds(
blocktree,
&receive_results.entries,
keypair,
last_tick == bank.max_tick_height(),
);
let to_shreds_elapsed = to_shreds_start.elapsed();
@ -309,7 +312,7 @@ mod test {
GenesisBlock,
Arc<RwLock<ClusterInfo>>,
Arc<Bank>,
Keypair,
Arc<Keypair>,
UdpSocket,
) {
// Setup
@ -317,7 +320,7 @@ mod test {
let blocktree = Arc::new(
Blocktree::open(&ledger_path).expect("Expected to be able to open database ledger"),
);
let leader_keypair = Keypair::new();
let leader_keypair = Arc::new(Keypair::new());
let leader_pubkey = leader_keypair.pubkey();
let leader_info = Node::new_localhost_with_pubkey(&leader_pubkey);
let cluster_info = Arc::new(RwLock::new(ClusterInfo::new_with_invalid_keypair(
@ -354,7 +357,7 @@ mod test {
};
// Step 1: Make an incomplete transmission for slot 0
let mut standard_broadcast_run = StandardBroadcastRun::new();
let mut standard_broadcast_run = StandardBroadcastRun::new(leader_keypair.clone());
standard_broadcast_run
.process_receive_results(&cluster_info, &socket, &blocktree, receive_results)
.unwrap();
@ -408,7 +411,8 @@ mod test {
fn test_slot_finish() {
// Setup
let num_shreds_per_slot = 2;
let (blocktree, genesis_block, cluster_info, bank0, _, socket) = setup(num_shreds_per_slot);
let (blocktree, genesis_block, cluster_info, bank0, leader_keypair, socket) =
setup(num_shreds_per_slot);
// Insert complete slot of ticks needed to finish the slot
let ticks = create_ticks(genesis_block.ticks_per_slot, genesis_block.hash());
@ -419,7 +423,7 @@ mod test {
last_tick: (ticks.len() - 1) as u64,
};
let mut standard_broadcast_run = StandardBroadcastRun::new();
let mut standard_broadcast_run = StandardBroadcastRun::new(leader_keypair);
standard_broadcast_run
.process_receive_results(&cluster_info, &socket, &blocktree, receive_results)
.unwrap();