Skip to content

Commit 44fc838

Browse files
authored
Merge pull request #1033 from rust-lang/edge-case-hunting
Idle coordinator after the last execution
2 parents 2d19f3d + f880078 commit 44fc838

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

ui/src/server_axum.rs

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -612,29 +612,54 @@ struct SandboxCache {
612612
impl SandboxCache {
613613
async fn crates(&self) -> Result<Stamped<MetaCratesResponse>> {
614614
let coordinator = Coordinator::new_docker().await;
615-
self.crates
615+
616+
let c = self
617+
.crates
616618
.fetch(|| async { Ok(coordinator.crates().await.context(CratesSnafu)?.into()) })
619+
.await;
620+
621+
coordinator
622+
.shutdown()
617623
.await
624+
.context(ShutdownCoordinatorSnafu)?;
625+
626+
c
618627
}
619628

620629
async fn versions(&self) -> Result<Stamped<MetaVersionsResponse>> {
621630
let coordinator = Coordinator::new_docker().await;
622631

623-
self.versions
632+
let v = self
633+
.versions
624634
.fetch(|| async { Ok(coordinator.versions().await.context(VersionsSnafu)?.into()) })
635+
.await;
636+
637+
coordinator
638+
.shutdown()
625639
.await
640+
.context(ShutdownCoordinatorSnafu)?;
641+
642+
v
626643
}
627644

628645
async fn raw_versions(&self) -> Result<Stamped<Arc<Versions>>> {
629646
let coordinator = Coordinator::new_docker().await;
630647

631-
self.raw_versions
648+
let rv = self
649+
.raw_versions
632650
.fetch(|| async {
633651
Ok(Arc::new(
634652
coordinator.versions().await.context(VersionsSnafu)?,
635653
))
636654
})
655+
.await;
656+
657+
coordinator
658+
.shutdown()
637659
.await
660+
.context(ShutdownCoordinatorSnafu)?;
661+
662+
rv
638663
}
639664

640665
async fn version_stable(&self) -> Result<Stamped<MetaVersionResponse>> {

ui/src/server_axum/websocket.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::{
66
};
77

88
use axum::extract::ws::{Message, WebSocket};
9-
use futures::{Future, FutureExt, StreamExt, TryFutureExt};
9+
use futures::{future::Fuse, Future, FutureExt, StreamExt, TryFutureExt};
1010
use orchestrator::{
1111
coordinator::{self, Coordinator, DockerBackend},
1212
DropErrorDetailsExt,
@@ -16,6 +16,7 @@ use std::{
1616
collections::BTreeMap,
1717
convert::TryFrom,
1818
mem,
19+
pin::pin,
1920
sync::{
2021
atomic::{AtomicU64, Ordering},
2122
Arc,
@@ -351,9 +352,8 @@ async fn handle_core(mut socket: WebSocket, feature_flags: FeatureFlags) {
351352
}
352353

353354
let mut manager = CoordinatorManager::new().await;
354-
tokio::pin! {
355-
let session_timeout = time::sleep(CoordinatorManager::SESSION_TIMEOUT);
356-
}
355+
let mut session_timeout = pin!(time::sleep(CoordinatorManager::SESSION_TIMEOUT));
356+
let mut idle_timeout = pin!(Fuse::terminated());
357357

358358
let mut active_executions = BTreeMap::new();
359359
let mut active_execution_gc_interval = time::interval(Duration::from_secs(30));
@@ -394,6 +394,12 @@ async fn handle_core(mut socket: WebSocket, feature_flags: FeatureFlags) {
394394

395395
// We don't care if there are no running tasks
396396
Some(task) = manager.join_next() => {
397+
// The last task has completed which means we are a
398+
// candidate for idling in a little while.
399+
if manager.is_empty() {
400+
idle_timeout.set(time::sleep(CoordinatorManager::IDLE_TIMEOUT).fuse());
401+
}
402+
397403
let (error, meta) = match task {
398404
Ok(Ok(())) => continue,
399405
Ok(Err(error)) => error,
@@ -425,7 +431,7 @@ async fn handle_core(mut socket: WebSocket, feature_flags: FeatureFlags) {
425431
.collect();
426432
},
427433

428-
_ = time::sleep(CoordinatorManager::IDLE_TIMEOUT), if manager.is_empty() => {
434+
_ = &mut idle_timeout, if manager.is_empty() => {
429435
let idled = manager.idle().await.context(StreamingCoordinatorIdleSnafu);
430436

431437
let Err(error) = idled else { continue };

0 commit comments

Comments
 (0)