From a934e0be1c960c99fa38a88798e55ef13f66be19 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 19 Oct 2025 13:00:50 +0100 Subject: [PATCH] Fix CPU spin when defunct runner is still in use User reported this problem on windows. Signed-off-by: Eric Curtin --- pkg/inference/scheduling/loader.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pkg/inference/scheduling/loader.go b/pkg/inference/scheduling/loader.go index 3116f04be..d734633f3 100644 --- a/pkg/inference/scheduling/loader.go +++ b/pkg/inference/scheduling/loader.go @@ -283,13 +283,22 @@ func (l *loader) idleCheckDuration() time.Duration { // Compute the oldest usage time for any idle runner. var oldest time.Time for _, runnerInfo := range l.runners { + // Check if this runner is defunct (process has exited) + defunct := false select { case <-l.slots[runnerInfo.slot].done: - // Check immediately if a runner is defunct - return 0 + defunct = true default: } + + // Only check unused runners. Defunct runners that are still in use + // will be handled when they become unused, so we don't schedule + // immediate checks for them (which would cause a tight CPU loop). if l.references[runnerInfo.slot] == 0 { + if defunct { + // Check immediately if an unused runner is defunct + return 0 + } timestamp := l.timestamps[runnerInfo.slot] if oldest.IsZero() || timestamp.Before(oldest) { oldest = timestamp