Remove code duplication between leader_to_validator/validator_to_leader

This commit is contained in:
Michael Vines
2019-02-10 17:23:32 -08:00
parent cd92adb1c6
commit 4ae1783b97

View File

@ -315,19 +315,21 @@ impl Fullnode {
} }
} }
fn leader_to_validator(&mut self, tick_height: u64) -> FullnodeReturnType { fn get_next_leader(&self, tick_height: u64) -> (Pubkey, u64) {
loop {
let bank_tick_height = self.bank.tick_height();
if bank_tick_height >= tick_height {
break;
}
trace!( trace!(
"leader_to_validator({:?}): tick_height={}, bt: {}", "Waiting for bank tick_height to catch up from {} to {}",
self.id, bank_tick_height,
tick_height, tick_height
self.bank.tick_height()
); );
while self.bank.tick_height() < tick_height {
sleep(Duration::from_millis(10)); sleep(Duration::from_millis(10));
} }
let scheduled_leader = { let (scheduled_leader, max_tick_height) = {
let mut leader_scheduler = self.bank.leader_scheduler.write().unwrap(); let mut leader_scheduler = self.bank.leader_scheduler.write().unwrap();
// A transition is only permitted on the final tick of a slot // A transition is only permitted on the final tick of a slot
@ -336,20 +338,43 @@ impl Fullnode {
leader_scheduler.update_tick_height(first_tick_of_next_slot, &self.bank); leader_scheduler.update_tick_height(first_tick_of_next_slot, &self.bank);
let slot = leader_scheduler.tick_height_to_slot(first_tick_of_next_slot); let slot = leader_scheduler.tick_height_to_slot(first_tick_of_next_slot);
leader_scheduler.get_leader_for_slot(slot).unwrap() (
leader_scheduler.get_leader_for_slot(slot).unwrap(),
first_tick_of_next_slot
+ leader_scheduler.num_ticks_left_in_slot(first_tick_of_next_slot),
)
}; };
debug!(
"node {:?} scheduled as leader for ticks [{}, {})",
scheduled_leader,
tick_height + 1,
max_tick_height
);
self.cluster_info self.cluster_info
.write() .write()
.unwrap() .unwrap()
.set_leader(scheduled_leader); .set_leader(scheduled_leader);
(scheduled_leader, max_tick_height)
}
fn leader_to_validator(&mut self, tick_height: u64) -> FullnodeReturnType {
trace!(
"leader_to_validator({:?}): tick_height={}",
self.id,
tick_height,
);
let (scheduled_leader, _max_tick_height) = self.get_next_leader(tick_height);
if scheduled_leader == self.id { if scheduled_leader == self.id {
debug!("node is still the leader"); debug!("node is still the leader");
let last_entry_id = self.bank.last_id(); let last_entry_id = self.bank.last_id();
self.validator_to_leader(tick_height, last_entry_id); self.validator_to_leader(tick_height, last_entry_id);
FullnodeReturnType::LeaderToLeaderRotation FullnodeReturnType::LeaderToLeaderRotation
} else { } else {
debug!("new leader is {}", scheduled_leader);
self.node_services.tpu.switch_to_forwarder( self.node_services.tpu.switch_to_forwarder(
self.tpu_sockets self.tpu_sockets
.iter() .iter()
@ -369,29 +394,8 @@ impl Fullnode {
last_entry_id, last_entry_id,
); );
let (scheduled_leader, max_tick_height) = { let (scheduled_leader, max_tick_height) = self.get_next_leader(tick_height);
let mut leader_scheduler = self.bank.leader_scheduler.write().unwrap();
// A transition is only permitted on the final tick of a slot
assert_eq!(leader_scheduler.num_ticks_left_in_slot(tick_height), 0);
let first_tick_of_next_slot = tick_height + 1;
leader_scheduler.update_tick_height(first_tick_of_next_slot, &self.bank);
let slot = leader_scheduler.tick_height_to_slot(first_tick_of_next_slot);
(
leader_scheduler.get_leader_for_slot(slot).unwrap(),
first_tick_of_next_slot
+ leader_scheduler.num_ticks_left_in_slot(first_tick_of_next_slot),
)
};
assert_eq!(scheduled_leader, self.id, "node is not the leader"); assert_eq!(scheduled_leader, self.id, "node is not the leader");
self.cluster_info.write().unwrap().set_leader(self.id);
debug!(
"node scheduled as leader for ticks [{}, {})",
tick_height + 1,
max_tick_height
);
let (to_validator_sender, to_validator_receiver) = channel(); let (to_validator_sender, to_validator_receiver) = channel();
self.to_validator_receiver = to_validator_receiver; self.to_validator_receiver = to_validator_receiver;