Implement periodic timeout checking for instances

This commit is contained in:
2025-08-17 21:10:48 +02:00
parent c734bcae4a
commit 5e3a28398d
3 changed files with 39 additions and 2 deletions

View File

@@ -15,8 +15,7 @@ func (i *Process) ShouldTimeout() bool {
i.mu.RLock() i.mu.RLock()
defer i.mu.RUnlock() defer i.mu.RUnlock()
// If idle timeout is not set, no timeout if !i.Running || i.options.IdleTimeout == nil || *i.options.IdleTimeout <= 0 {
if i.options.IdleTimeout == nil || *i.options.IdleTimeout <= 0 {
return false return false
} }

View File

@@ -10,6 +10,7 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"sync" "sync"
"time"
) )
// InstanceManager defines the interface for managing instances of the llama server. // InstanceManager defines the interface for managing instances of the llama server.
@@ -31,6 +32,9 @@ type instanceManager struct {
instances map[string]*instance.Process instances map[string]*instance.Process
ports map[int]bool ports map[int]bool
instancesConfig config.InstancesConfig instancesConfig config.InstancesConfig
// Timeout checker
timeoutChecker *time.Ticker
} }
// NewInstanceManager creates a new instance of InstanceManager. // NewInstanceManager creates a new instance of InstanceManager.
@@ -39,12 +43,21 @@ func NewInstanceManager(instancesConfig config.InstancesConfig) InstanceManager
instances: make(map[string]*instance.Process), instances: make(map[string]*instance.Process),
ports: make(map[int]bool), ports: make(map[int]bool),
instancesConfig: instancesConfig, instancesConfig: instancesConfig,
timeoutChecker: time.NewTicker(time.Duration(instancesConfig.TimeoutCheckInterval) * time.Minute),
} }
// Load existing instances from disk // Load existing instances from disk
if err := im.loadInstances(); err != nil { if err := im.loadInstances(); err != nil {
log.Printf("Error loading instances: %v", err) log.Printf("Error loading instances: %v", err)
} }
go func() {
for range im.timeoutChecker.C {
im.checkAllTimeouts()
}
}()
return im return im
} }
@@ -94,6 +107,12 @@ func (im *instanceManager) Shutdown() {
im.mu.Lock() im.mu.Lock()
defer im.mu.Unlock() defer im.mu.Unlock()
// Stop the timeout checker
if im.timeoutChecker != nil {
im.timeoutChecker.Stop()
im.timeoutChecker = nil
}
var wg sync.WaitGroup var wg sync.WaitGroup
wg.Add(len(im.instances)) wg.Add(len(im.instances))

19
pkg/manager/timeout.go Normal file
View File

@@ -0,0 +1,19 @@
package manager
import "log"
func (im *instanceManager) checkAllTimeouts() {
im.mu.RLock()
defer im.mu.RUnlock()
for _, inst := range im.instances {
if inst.ShouldTimeout() {
log.Printf("Instance %s has timed out, stopping it", inst.Name)
if proc, err := im.StopInstance(inst.Name); err != nil {
log.Printf("Error stopping instance %s: %v", inst.Name, err)
} else {
log.Printf("Instance %s stopped successfully, process: %v", inst.Name, proc)
}
}
}
}