From d4906d33c26b75d92e7d80040c488faa90a257c6 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Thu, 5 Dec 2024 15:25:16 +0000 Subject: [PATCH] fix: DockerData spawns insertion error. Previously incorrectly checking spawn entry in the hashmap, now use VacantEntry matching before spawning a tokio thread --- src/docker_data/mod.rs | 51 +++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/src/docker_data/mod.rs b/src/docker_data/mod.rs index 87301a0..437e7a9 100644 --- a/src/docker_data/mod.rs +++ b/src/docker_data/mod.rs @@ -178,18 +178,18 @@ impl DockerData { let all_ids = self.app_data.lock().get_all_id_state(); for (state, id) in all_ids { let spawn_id = SpawnId::Stats((id, self.binate)); - self.spawns - .lock() - .entry(spawn_id.clone()) - .or_insert_with(|| { - tokio::spawn(Self::update_container_stat( - Arc::clone(&self.app_data), - Arc::clone(&self.docker), - state, - spawn_id, - Arc::clone(&self.spawns), - )) - }); + + if let std::collections::hash_map::Entry::Vacant(spawns) = + self.spawns.lock().entry(spawn_id.clone()) + { + spawns.insert(tokio::spawn(Self::update_container_stat( + Arc::clone(&self.app_data), + Arc::clone(&self.docker), + state, + spawn_id, + Arc::clone(&self.spawns), + ))); + } } self.binate = self.binate.toggle(); } @@ -305,19 +305,20 @@ impl DockerData { self.update_all_containers().await; if let Some(container) = self.app_data.lock().get_selected_container() { let last_updated = container.last_updated; - self.spawns - .lock() - .entry(SpawnId::Log(container.id.clone())) - .or_insert_with(|| { - tokio::spawn(Self::update_log( - Arc::clone(&self.app_data), - Arc::clone(&self.docker), - container.id.clone(), - last_updated, - Arc::clone(&self.spawns), - self.args.std_err, - )) - }); + let spawn_id = SpawnId::Log(container.id.clone()); + // Only spawn if not already sapwned with a given id/binate pair + if let std::collections::hash_map::Entry::Vacant(spawns) = + self.spawns.lock().entry(spawn_id) + { + spawns.insert(tokio::spawn(Self::update_log( + Arc::clone(&self.app_data), + Arc::clone(&self.docker), + container.id.clone(), + last_updated, + Arc::clone(&self.spawns), + self.args.std_err, + ))); + } }; self.update_all_container_stats(); self.app_data.lock().sort_containers();