Skip to content

Commit d4906d3

Browse files
committed
fix: DockerData spawns insertion error.
Previously incorrectly checking spawn entry in the hashmap, now use VacantEntry matching before spawning a tokio thread
1 parent 6434791 commit d4906d3

File tree

1 file changed

+26
-25
lines changed

1 file changed

+26
-25
lines changed

src/docker_data/mod.rs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -178,18 +178,18 @@ impl DockerData {
178178
let all_ids = self.app_data.lock().get_all_id_state();
179179
for (state, id) in all_ids {
180180
let spawn_id = SpawnId::Stats((id, self.binate));
181-
self.spawns
182-
.lock()
183-
.entry(spawn_id.clone())
184-
.or_insert_with(|| {
185-
tokio::spawn(Self::update_container_stat(
186-
Arc::clone(&self.app_data),
187-
Arc::clone(&self.docker),
188-
state,
189-
spawn_id,
190-
Arc::clone(&self.spawns),
191-
))
192-
});
181+
182+
if let std::collections::hash_map::Entry::Vacant(spawns) =
183+
self.spawns.lock().entry(spawn_id.clone())
184+
{
185+
spawns.insert(tokio::spawn(Self::update_container_stat(
186+
Arc::clone(&self.app_data),
187+
Arc::clone(&self.docker),
188+
state,
189+
spawn_id,
190+
Arc::clone(&self.spawns),
191+
)));
192+
}
193193
}
194194
self.binate = self.binate.toggle();
195195
}
@@ -305,19 +305,20 @@ impl DockerData {
305305
self.update_all_containers().await;
306306
if let Some(container) = self.app_data.lock().get_selected_container() {
307307
let last_updated = container.last_updated;
308-
self.spawns
309-
.lock()
310-
.entry(SpawnId::Log(container.id.clone()))
311-
.or_insert_with(|| {
312-
tokio::spawn(Self::update_log(
313-
Arc::clone(&self.app_data),
314-
Arc::clone(&self.docker),
315-
container.id.clone(),
316-
last_updated,
317-
Arc::clone(&self.spawns),
318-
self.args.std_err,
319-
))
320-
});
308+
let spawn_id = SpawnId::Log(container.id.clone());
309+
// Only spawn if not already sapwned with a given id/binate pair
310+
if let std::collections::hash_map::Entry::Vacant(spawns) =
311+
self.spawns.lock().entry(spawn_id)
312+
{
313+
spawns.insert(tokio::spawn(Self::update_log(
314+
Arc::clone(&self.app_data),
315+
Arc::clone(&self.docker),
316+
container.id.clone(),
317+
last_updated,
318+
Arc::clone(&self.spawns),
319+
self.args.std_err,
320+
)));
321+
}
321322
};
322323
self.update_all_container_stats();
323324
self.app_data.lock().sort_containers();

0 commit comments

Comments
 (0)