better restart error handling by 15s wait
This commit is contained in:
+34
-15
@@ -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"
|
||||||
@@ -13,8 +14,12 @@ 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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user