mirror of
https://github.com/lordmathis/llamactl.git
synced 2025-11-06 09:04:27 +00:00
Merge pull request #55 from lordmathis/fix/auto-restart
fix: Set status to Stopped for instances with auto-restart disabled
This commit is contained in:
@@ -263,19 +263,32 @@ func (im *instanceManager) loadInstance(name, path string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// autoStartInstances starts instances that were running when persisted and have auto-restart enabled
|
// autoStartInstances starts instances that were running when persisted and have auto-restart enabled
|
||||||
|
// For instances with auto-restart disabled, it sets their status to Stopped
|
||||||
func (im *instanceManager) autoStartInstances() {
|
func (im *instanceManager) autoStartInstances() {
|
||||||
im.mu.RLock()
|
im.mu.RLock()
|
||||||
var instancesToStart []*instance.Process
|
var instancesToStart []*instance.Process
|
||||||
|
var instancesToStop []*instance.Process
|
||||||
for _, inst := range im.instances {
|
for _, inst := range im.instances {
|
||||||
if inst.IsRunning() && // Was running when persisted
|
if inst.IsRunning() && // Was running when persisted
|
||||||
inst.GetOptions() != nil &&
|
inst.GetOptions() != nil &&
|
||||||
inst.GetOptions().AutoRestart != nil &&
|
inst.GetOptions().AutoRestart != nil {
|
||||||
*inst.GetOptions().AutoRestart {
|
if *inst.GetOptions().AutoRestart {
|
||||||
instancesToStart = append(instancesToStart, inst)
|
instancesToStart = append(instancesToStart, inst)
|
||||||
|
} else {
|
||||||
|
// Instance was running but auto-restart is disabled, mark as stopped
|
||||||
|
instancesToStop = append(instancesToStop, inst)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
im.mu.RUnlock()
|
im.mu.RUnlock()
|
||||||
|
|
||||||
|
// Stop instances that have auto-restart disabled
|
||||||
|
for _, inst := range instancesToStop {
|
||||||
|
log.Printf("Instance %s was running but auto-restart is disabled, setting status to stopped", inst.Name)
|
||||||
|
inst.SetStatus(instance.Stopped)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start instances that have auto-restart enabled
|
||||||
for _, inst := range instancesToStart {
|
for _, inst := range instancesToStart {
|
||||||
log.Printf("Auto-starting instance %s", inst.Name)
|
log.Printf("Auto-starting instance %s", inst.Name)
|
||||||
// Reset running state before starting (since Start() expects stopped instance)
|
// Reset running state before starting (since Start() expects stopped instance)
|
||||||
|
|||||||
@@ -209,3 +209,66 @@ func createTestManager() manager.InstanceManager {
|
|||||||
}
|
}
|
||||||
return manager.NewInstanceManager(backendConfig, cfg)
|
return manager.NewInstanceManager(backendConfig, cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAutoRestartDisabledInstanceStatus(t *testing.T) {
|
||||||
|
tempDir := t.TempDir()
|
||||||
|
|
||||||
|
backendConfig := config.BackendConfig{
|
||||||
|
LlamaCpp: config.BackendSettings{
|
||||||
|
Command: "llama-server",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := config.InstancesConfig{
|
||||||
|
PortRange: [2]int{8000, 9000},
|
||||||
|
InstancesDir: tempDir,
|
||||||
|
MaxInstances: 10,
|
||||||
|
TimeoutCheckInterval: 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create first manager and instance with auto-restart disabled
|
||||||
|
manager1 := manager.NewInstanceManager(backendConfig, cfg)
|
||||||
|
|
||||||
|
autoRestart := false
|
||||||
|
options := &instance.CreateInstanceOptions{
|
||||||
|
BackendType: backends.BackendTypeLlamaCpp,
|
||||||
|
AutoRestart: &autoRestart,
|
||||||
|
LlamaServerOptions: &llamacpp.LlamaServerOptions{
|
||||||
|
Model: "/path/to/model.gguf",
|
||||||
|
Port: 8080,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
inst, err := manager1.CreateInstance("test-instance", options)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("CreateInstance failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simulate instance being in running state when persisted
|
||||||
|
// (this would happen if the instance was running when llamactl was stopped)
|
||||||
|
inst.SetStatus(instance.Running)
|
||||||
|
|
||||||
|
// Shutdown first manager
|
||||||
|
manager1.Shutdown()
|
||||||
|
|
||||||
|
// Create second manager (simulating restart of llamactl)
|
||||||
|
manager2 := manager.NewInstanceManager(backendConfig, cfg)
|
||||||
|
|
||||||
|
// Get the loaded instance
|
||||||
|
loadedInst, err := manager2.GetInstance("test-instance")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("GetInstance failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The instance should be marked as Stopped, not Running
|
||||||
|
// because auto-restart is disabled
|
||||||
|
if loadedInst.IsRunning() {
|
||||||
|
t.Errorf("Expected instance with auto-restart disabled to be stopped after manager restart, but it was running")
|
||||||
|
}
|
||||||
|
|
||||||
|
if loadedInst.GetStatus() != instance.Stopped {
|
||||||
|
t.Errorf("Expected instance status to be Stopped, got %v", loadedInst.GetStatus())
|
||||||
|
}
|
||||||
|
|
||||||
|
manager2.Shutdown()
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user