Remove code duplication between leader_to_validator/validator_to_leader
This commit is contained in:
@ -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) {
|
||||||
trace!(
|
loop {
|
||||||
"leader_to_validator({:?}): tick_height={}, bt: {}",
|
let bank_tick_height = self.bank.tick_height();
|
||||||
self.id,
|
if bank_tick_height >= tick_height {
|
||||||
tick_height,
|
break;
|
||||||
self.bank.tick_height()
|
}
|
||||||
);
|
trace!(
|
||||||
|
"Waiting for bank tick_height to catch up from {} to {}",
|
||||||
while self.bank.tick_height() < tick_height {
|
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;
|
||||||
|
Reference in New Issue
Block a user