Skip to content

Commit 2bddb91

Browse files
authored
Turbopack: Stop persisting background task correctly on stop (#82727)
### What? Fixes a race condition with the persisting background tasks when stopping the backend.
1 parent 97dbf5f commit 2bddb91

File tree

1 file changed

+30
-29
lines changed
  • turbopack/crates/turbo-tasks-backend/src/backend

1 file changed

+30
-29
lines changed

turbopack/crates/turbo-tasks-backend/src/backend/mod.rs

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2137,36 +2137,37 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
21372137
let until = last_snapshot + time;
21382138
if until > Instant::now() {
21392139
let mut stop_listener = self.stopping_event.listen();
2140-
if !self.stopping.load(Ordering::Acquire) {
2141-
let mut idle_start_listener = self.idle_start_event.listen();
2142-
let mut idle_end_listener = self.idle_end_event.listen();
2143-
let mut idle_time = if turbo_tasks.is_idle() {
2144-
Instant::now() + IDLE_TIMEOUT
2145-
} else {
2146-
far_future()
2147-
};
2148-
loop {
2149-
tokio::select! {
2150-
_ = &mut stop_listener => {
2151-
break;
2152-
},
2153-
_ = &mut idle_start_listener => {
2154-
idle_time = Instant::now() + IDLE_TIMEOUT;
2155-
idle_start_listener = self.idle_start_event.listen()
2156-
},
2157-
_ = &mut idle_end_listener => {
2158-
idle_time = until + IDLE_TIMEOUT;
2159-
idle_end_listener = self.idle_end_event.listen()
2160-
},
2161-
_ = tokio::time::sleep_until(until) => {
2140+
if self.stopping.load(Ordering::Acquire) {
2141+
return;
2142+
}
2143+
let mut idle_start_listener = self.idle_start_event.listen();
2144+
let mut idle_end_listener = self.idle_end_event.listen();
2145+
let mut idle_time = if turbo_tasks.is_idle() {
2146+
Instant::now() + IDLE_TIMEOUT
2147+
} else {
2148+
far_future()
2149+
};
2150+
loop {
2151+
tokio::select! {
2152+
_ = &mut stop_listener => {
2153+
return;
2154+
},
2155+
_ = &mut idle_start_listener => {
2156+
idle_time = Instant::now() + IDLE_TIMEOUT;
2157+
idle_start_listener = self.idle_start_event.listen()
2158+
},
2159+
_ = &mut idle_end_listener => {
2160+
idle_time = until + IDLE_TIMEOUT;
2161+
idle_end_listener = self.idle_end_event.listen()
2162+
},
2163+
_ = tokio::time::sleep_until(until) => {
2164+
break;
2165+
},
2166+
_ = tokio::time::sleep_until(idle_time) => {
2167+
if turbo_tasks.is_idle() {
21622168
break;
2163-
},
2164-
_ = tokio::time::sleep_until(idle_time) => {
2165-
if turbo_tasks.is_idle() {
2166-
break;
2167-
}
2168-
},
2169-
}
2169+
}
2170+
},
21702171
}
21712172
}
21722173
}

0 commit comments

Comments
 (0)