refactor: docker data spawns

Change from HashMap<id, handle>, to just HashSet<id>
This commit is contained in:
Jack Wills
2026-01-27 21:50:21 +00:00
parent dc6206c55e
commit cd943f67e4
3 changed files with 26 additions and 36 deletions
-2
View File
@@ -79,8 +79,6 @@ pub struct ConfigFile {
pub use_cli: Option<bool>, pub use_cli: Option<bool>,
} }
impl ConfigFile { impl ConfigFile {
/// Attempt to create a config.toml file, will attempt to recursively create the directories as well /// Attempt to create a config.toml file, will attempt to recursively create the directories as well
fn crate_config_file(in_container: bool) -> Result<(), AppError> { fn crate_config_file(in_container: bool) -> Result<(), AppError> {
+21 -29
View File
@@ -10,13 +10,10 @@ use bollard::{
use futures_util::StreamExt; use futures_util::StreamExt;
use parking_lot::Mutex; use parking_lot::Mutex;
use std::{ use std::{
collections::HashMap, collections::HashSet,
sync::{Arc, atomic::AtomicUsize}, sync::{Arc, atomic::AtomicUsize},
}; };
use tokio::{ use tokio::sync::mpsc::{Receiver, Sender};
sync::mpsc::{Receiver, Sender},
task::JoinHandle,
};
use uuid::Uuid; use uuid::Uuid;
use crate::{ use crate::{
@@ -70,7 +67,7 @@ pub struct DockerData {
docker: Arc<Docker>, docker: Arc<Docker>,
gui_state: Arc<Mutex<GuiState>>, gui_state: Arc<Mutex<GuiState>>,
receiver: Receiver<DockerMessage>, receiver: Receiver<DockerMessage>,
spawns: Arc<Mutex<HashMap<SpawnId, JoinHandle<()>>>>, spawns: Arc<Mutex<HashSet<SpawnId>>>,
} }
impl DockerData { impl DockerData {
@@ -132,7 +129,7 @@ impl DockerData {
docker: Arc<Docker>, docker: Arc<Docker>,
state: State, state: State,
spawn_id: SpawnId, spawn_id: SpawnId,
spawns: Arc<Mutex<HashMap<SpawnId, JoinHandle<()>>>>, spawns: Arc<Mutex<HashSet<SpawnId>>>,
) { ) {
let id = spawn_id.get_id(); let id = spawn_id.get_id();
let mut stream = docker let mut stream = docker
@@ -200,17 +197,13 @@ impl DockerData {
for (state, id) in all_ids { for (state, id) in all_ids {
let spawn_id = SpawnId::Stats((id, self.binate)); let spawn_id = SpawnId::Stats((id, self.binate));
if let std::collections::hash_map::Entry::Vacant(spawns) = if !self.spawns.lock().contains(&spawn_id) {
self.spawns.lock().entry(spawn_id.clone()) let app_data = Arc::clone(&self.app_data);
{ let docker = Arc::clone(&self.docker);
// TODO Replace this with toktio tokens let spawns = Arc::clone(&self.spawns);
spawns.insert(tokio::spawn(Self::update_container_stat( tokio::spawn(Self::update_container_stat(
Arc::clone(&self.app_data), app_data, docker, state, spawn_id, spawns,
Arc::clone(&self.docker), ));
state,
spawn_id,
Arc::clone(&self.spawns),
)));
} }
} }
self.binate = self.binate.toggle(); self.binate = self.binate.toggle();
@@ -257,7 +250,7 @@ impl DockerData {
docker: Arc<Docker>, docker: Arc<Docker>,
id: ContainerId, id: ContainerId,
since: u64, since: u64,
spawns: Arc<Mutex<HashMap<SpawnId, JoinHandle<()>>>>, spawns: Arc<Mutex<HashSet<SpawnId>>>,
stderr: bool, stderr: bool,
) { ) {
let options = Some(LogsOptions { let options = Some(LogsOptions {
@@ -291,13 +284,13 @@ impl DockerData {
let spawns = Arc::clone(&self.spawns); let spawns = Arc::clone(&self.spawns);
let std_err = self.config.show_std_err; let std_err = self.config.show_std_err;
let init = Arc::clone(&init); let init = Arc::clone(&init);
self.spawns.lock().insert(
SpawnId::Log(id.clone()), self.spawns.lock().insert(SpawnId::Log(id.clone()));
tokio::spawn(async move { tokio::spawn(async move {
Self::update_log(app_data, docker, id, 0, spawns, std_err).await; Self::update_log(app_data, docker, id, 0, spawns, std_err).await;
init.fetch_add(1, std::sync::atomic::Ordering::SeqCst); init.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}), });
);
} }
init init
} }
@@ -328,17 +321,16 @@ impl DockerData {
let last_updated = container.last_updated; let last_updated = container.last_updated;
let spawn_id = SpawnId::Log(container.id.clone()); let spawn_id = SpawnId::Log(container.id.clone());
// Only spawn if not already spawned with a given id/binate pair // Only spawn if not already spawned with a given id/binate pair
if let std::collections::hash_map::Entry::Vacant(spawns) = if !self.spawns.lock().contains(&spawn_id) {
self.spawns.lock().entry(spawn_id) self.spawns.lock().insert(spawn_id.clone());
{ tokio::spawn(Self::update_log(
spawns.insert(tokio::spawn(Self::update_log(
Arc::clone(&self.app_data), Arc::clone(&self.app_data),
Arc::clone(&self.docker), Arc::clone(&self.docker),
container.id.clone(), container.id.clone(),
last_updated, last_updated,
Arc::clone(&self.spawns), Arc::clone(&self.spawns),
self.config.show_std_err, self.config.show_std_err,
))); ));
} }
} }
self.update_all_container_stats(); self.update_all_container_stats();
@@ -458,7 +450,7 @@ impl DockerData {
docker: Arc::new(docker), docker: Arc::new(docker),
gui_state, gui_state,
receiver: docker_rx, receiver: docker_rx,
spawns: Arc::new(Mutex::new(HashMap::new())), spawns: Arc::new(Mutex::new(HashSet::new())),
}; };
inner.initialise_container_data().await; inner.initialise_container_data().await;
Self::heartbeat(&inner.config, docker_tx); Self::heartbeat(&inner.config, docker_tx);