Fix resource hogging when waiting for role transition

This commit is contained in:
Sagar Dhawan
2019-02-06 15:31:41 -08:00
committed by Michael Vines
parent d9e2b94d7a
commit 9681c4d468

View File

@ -403,28 +403,25 @@ impl Fullnode {
} }
fn handle_role_transition(&mut self) -> Option<(FullnodeReturnType, u64)> { fn handle_role_transition(&mut self) -> Option<(FullnodeReturnType, u64)> {
loop { if self.node_services.tpu.is_leader() {
if self.exit.load(Ordering::Relaxed) { let should_be_forwarder = self.role_notifiers.1.recv();
return None; match should_be_forwarder {
Ok(TpuReturnType::LeaderRotation(tick_height)) => {
Some((self.leader_to_validator(tick_height), tick_height + 1))
} }
let should_be_forwarder = self.role_notifiers.1.try_recv(); Err(_) => None,
let should_be_leader = self.role_notifiers.0.try_recv(); }
} else {
let should_be_leader = self.role_notifiers.0.recv();
match should_be_leader { match should_be_leader {
Ok(TvuReturnType::LeaderRotation(tick_height, entry_height, last_entry_id)) => { Ok(TvuReturnType::LeaderRotation(tick_height, entry_height, last_entry_id)) => {
self.validator_to_leader(tick_height, entry_height, last_entry_id); self.validator_to_leader(tick_height, entry_height, last_entry_id);
return Some(( Some((
FullnodeReturnType::ValidatorToLeaderRotation, FullnodeReturnType::ValidatorToLeaderRotation,
tick_height + 1, tick_height + 1,
)); ))
} }
_ => match should_be_forwarder { Err(_) => None,
Ok(TpuReturnType::LeaderRotation(tick_height)) => {
return Some((self.leader_to_validator(tick_height), tick_height + 1))
}
_ => {
continue;
}
},
} }
} }
} }
@ -438,6 +435,12 @@ impl Fullnode {
let (sender, receiver) = channel(); let (sender, receiver) = channel();
let exit = self.exit.clone(); let exit = self.exit.clone();
spawn(move || loop { spawn(move || loop {
if self.exit.load(Ordering::Relaxed) {
debug!("node shutdown requested");
self.close().expect("Unable to close node");
sender.send(true).expect("Unable to signal exit");
break;
}
let status = self.handle_role_transition(); let status = self.handle_role_transition();
match status { match status {
None => { None => {