fix: DockerData spawns insertion error.

Previously incorrectly checking spawn entry in the hashmap, now use VacantEntry matching before spawning a tokio thread
This commit is contained in:
Jack Wills
2024-12-05 15:25:16 +00:00
parent 6434791936
commit d4906d33c2
+26 -25
View File
@@ -178,18 +178,18 @@ impl DockerData {
let all_ids = self.app_data.lock().get_all_id_state(); let all_ids = self.app_data.lock().get_all_id_state();
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));
self.spawns
.lock() if let std::collections::hash_map::Entry::Vacant(spawns) =
.entry(spawn_id.clone()) self.spawns.lock().entry(spawn_id.clone())
.or_insert_with(|| { {
tokio::spawn(Self::update_container_stat( spawns.insert(tokio::spawn(Self::update_container_stat(
Arc::clone(&self.app_data), Arc::clone(&self.app_data),
Arc::clone(&self.docker), Arc::clone(&self.docker),
state, state,
spawn_id, spawn_id,
Arc::clone(&self.spawns), Arc::clone(&self.spawns),
)) )));
}); }
} }
self.binate = self.binate.toggle(); self.binate = self.binate.toggle();
} }
@@ -305,19 +305,20 @@ impl DockerData {
self.update_all_containers().await; self.update_all_containers().await;
if let Some(container) = self.app_data.lock().get_selected_container() { if let Some(container) = self.app_data.lock().get_selected_container() {
let last_updated = container.last_updated; let last_updated = container.last_updated;
self.spawns let spawn_id = SpawnId::Log(container.id.clone());
.lock() // Only spawn if not already sapwned with a given id/binate pair
.entry(SpawnId::Log(container.id.clone())) if let std::collections::hash_map::Entry::Vacant(spawns) =
.or_insert_with(|| { self.spawns.lock().entry(spawn_id)
tokio::spawn(Self::update_log( {
Arc::clone(&self.app_data), spawns.insert(tokio::spawn(Self::update_log(
Arc::clone(&self.docker), Arc::clone(&self.app_data),
container.id.clone(), Arc::clone(&self.docker),
last_updated, container.id.clone(),
Arc::clone(&self.spawns), last_updated,
self.args.std_err, Arc::clone(&self.spawns),
)) self.args.std_err,
}); )));
}
}; };
self.update_all_container_stats(); self.update_all_container_stats();
self.app_data.lock().sort_containers(); self.app_data.lock().sort_containers();