From db6907dea501dae5f605ac05bb035a2227ed98bc Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Sun, 1 Jan 2023 07:22:10 +1300 Subject: [PATCH] FIX: hot loop in overlord when there are no minions --- src/overlord/mod.rs | 48 ++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/src/overlord/mod.rs b/src/overlord/mod.rs index a04c3a9e..86dd7a4d 100644 --- a/src/overlord/mod.rs +++ b/src/overlord/mod.rs @@ -20,7 +20,7 @@ use zeroize::Zeroize; pub struct Overlord { to_minions: Sender, - from_minions: UnboundedReceiver, + inbox: UnboundedReceiver, // All the minion tasks running. minions: task::JoinSet<()>, @@ -33,11 +33,11 @@ pub struct Overlord { } impl Overlord { - pub fn new(from_minions: UnboundedReceiver) -> Overlord { + pub fn new(inbox: UnboundedReceiver) -> Overlord { let to_minions = GLOBALS.to_minions.clone(); Overlord { to_minions, - from_minions, + inbox, minions: task::JoinSet::new(), minions_task_url: HashMap::new(), urls_watching: Vec::new(), @@ -278,19 +278,35 @@ impl Overlord { async fn loop_handler(&mut self) -> Result { let mut keepgoing: bool = true; - select! { - bus_message = self.from_minions.recv() => { - let bus_message = match bus_message { - Some(bm) => bm, - None => { - // All senders dropped, or one of them closed. - return Ok(false); - } - }; - keepgoing = self.handle_bus_message(bus_message).await?; - }, - task_nextjoined = self.minions.join_next_with_id() => { - self.handle_task_nextjoined(task_nextjoined).await; + tracing::debug!("overlord looping"); + + if self.minions.is_empty() { + // Just listen on inbox + let bus_message = self.inbox.recv().await; + let bus_message = match bus_message { + Some(bm) => bm, + None => { + // All senders dropped, or one of them closed. + return Ok(false); + } + }; + keepgoing = self.handle_bus_message(bus_message).await?; + } else { + // Listen on inbox, and dying minions + select! { + bus_message = self.inbox.recv() => { + let bus_message = match bus_message { + Some(bm) => bm, + None => { + // All senders dropped, or one of them closed. + return Ok(false); + } + }; + keepgoing = self.handle_bus_message(bus_message).await?; + }, + task_nextjoined = self.minions.join_next_with_id() => { + self.handle_task_nextjoined(task_nextjoined).await; + } } }