better restart error handling by 15s wait

This commit is contained in:
Alireza Ahmadi
2026-03-07 14:39:55 +01:00
parent 7b5b30ca8f
commit 93dd02f53e
+32 -13
View File
@@ -3,6 +3,7 @@ package service
import ( import (
"encoding/json" "encoding/json"
"strconv" "strconv"
"sync"
"time" "time"
"github.com/alireza0/s-ui/core" "github.com/alireza0/s-ui/core"
@@ -15,6 +16,10 @@ import (
var ( var (
LastUpdate int64 LastUpdate int64
corePtr *core.Core corePtr *core.Core
startCoreMu sync.Mutex
startCoreInProgress bool
lastStartFailTime time.Time
startCooldown = 15 * time.Second
) )
type ConfigService struct { type ConfigService struct {
@@ -85,12 +90,33 @@ func (s *ConfigService) StartCore() error {
if corePtr.IsRunning() { if corePtr.IsRunning() {
return nil return nil
} }
startCoreMu.Lock()
if startCoreInProgress {
startCoreMu.Unlock()
return nil
}
if time.Since(lastStartFailTime) < startCooldown {
startCoreMu.Unlock()
return nil
}
startCoreInProgress = true
startCoreMu.Unlock()
defer func() {
startCoreMu.Lock()
startCoreInProgress = false
startCoreMu.Unlock()
}()
logger.Info("starting core")
rawConfig, err := s.GetConfig("") rawConfig, err := s.GetConfig("")
if err != nil { if err != nil {
return err return err
} }
err = corePtr.Start(*rawConfig) err = corePtr.Start(*rawConfig)
if err != nil { if err != nil {
startCoreMu.Lock()
lastStartFailTime = time.Now()
startCoreMu.Unlock()
logger.Error("start sing-box err:", err.Error()) logger.Error("start sing-box err:", err.Error())
return err return err
} }
@@ -107,29 +133,22 @@ func (s *ConfigService) RestartCore() error {
} }
func (s *ConfigService) restartCoreWithConfig(config json.RawMessage) error { func (s *ConfigService) restartCoreWithConfig(config json.RawMessage) error {
var err error
defer func() {
if err != nil {
corePtr.Stop()
logger.Error("restart sing-box err:", err.Error())
} else {
logger.Info("sing-box restarted with new config")
}
}()
if corePtr.IsRunning() { if corePtr.IsRunning() {
err = corePtr.Stop() if err := corePtr.Stop(); err != nil {
if err != nil { logger.Error("restart sing-box err (stop):", err.Error())
return err return err
} }
} }
rawConfig, err := s.GetConfig(string(config)) rawConfig, err := s.GetConfig(string(config))
if err != nil { if err != nil {
logger.Error("restart sing-box err (get config):", err.Error())
return err return err
} }
err = corePtr.Start(*rawConfig) if err := corePtr.Start(*rawConfig); err != nil {
if err != nil { logger.Error("restart sing-box err (start):", err.Error())
return err return err
} }
logger.Info("sing-box restarted with new config")
return nil return nil
} }