task: properly handle removed entries in JoinMap (#7264)

This commit is contained in:
Conrad Ludgate
2025-04-15 16:33:20 +02:00
committed by GitHub
parent 964fd06e0f
commit c3037adac9
2 changed files with 58 additions and 9 deletions
+12 -9
View File
@@ -469,16 +469,19 @@ where
///
/// [`tokio::select!`]: tokio::select
pub async fn join_next(&mut self) -> Option<(K, Result<V, JoinError>)> {
let (res, id) = match self.tasks.join_next_with_id().await {
Some(Ok((id, output))) => (Ok(output), id),
Some(Err(e)) => {
let id = e.id();
(Err(e), id)
loop {
let (res, id) = match self.tasks.join_next_with_id().await {
Some(Ok((id, output))) => (Ok(output), id),
Some(Err(e)) => {
let id = e.id();
(Err(e), id)
}
None => return None,
};
if let Some(key) = self.remove_by_id(id) {
break Some((key, res));
}
None => return None,
};
let key = self.remove_by_id(id)?;
Some((key, res))
}
}
/// Aborts all tasks and waits for them to finish shutting down.