v1.5.1 增强程序稳定性
This commit is contained in:
@@ -34,6 +34,7 @@ import (
|
||||
"regexp"
|
||||
"runtime"
|
||||
"runtime/debug"
|
||||
"sync/atomic"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
@@ -46,7 +47,18 @@ var sharedDomainManager *DomainManager
|
||||
var sharedRecordManager *RecordManager
|
||||
var sharedRouteManager *RouteManager
|
||||
var sharedKeyManager *KeyManager
|
||||
var sharedNodeConfig = &dnsconfigs.NSNodeConfig{}
|
||||
|
||||
var sharedNodeConfig atomic.Pointer[dnsconfigs.NSNodeConfig]
|
||||
|
||||
func init() {
|
||||
// 初始化默认空配置
|
||||
sharedNodeConfig.Store(&dnsconfigs.NSNodeConfig{})
|
||||
}
|
||||
|
||||
// dnsNodeConfig 返回当前 DNS 节点配置(并发安全)
|
||||
func dnsNodeConfig() *dnsconfigs.NSNodeConfig {
|
||||
return sharedNodeConfig.Load()
|
||||
}
|
||||
|
||||
func NewDNSNode() *DNSNode {
|
||||
return &DNSNode{
|
||||
@@ -105,13 +117,19 @@ func (this *DNSNode) Start() {
|
||||
events.Notify(events.EventStart)
|
||||
|
||||
// 监控状态
|
||||
go NewNodeStatusExecutor().Listen()
|
||||
goman.New(func() {
|
||||
NewNodeStatusExecutor().Listen()
|
||||
})
|
||||
|
||||
// 连接API
|
||||
go NewAPIStream().Start()
|
||||
goman.New(func() {
|
||||
NewAPIStream().Start()
|
||||
})
|
||||
|
||||
// 启动
|
||||
go this.start()
|
||||
goman.New(func() {
|
||||
this.start()
|
||||
})
|
||||
|
||||
// Hold住进程
|
||||
logs.Println("[DNS_NODE]started")
|
||||
@@ -224,7 +242,7 @@ func (this *DNSNode) listenSock() error {
|
||||
}
|
||||
|
||||
// 启动监听
|
||||
go func() {
|
||||
goman.New(func() {
|
||||
this.sock.OnCommand(func(cmd *gosock.Command) {
|
||||
switch cmd.Code {
|
||||
case "pid":
|
||||
@@ -262,7 +280,7 @@ func (this *DNSNode) listenSock() error {
|
||||
if err != nil {
|
||||
logs.Println("NODE", err.Error())
|
||||
}
|
||||
}()
|
||||
})
|
||||
|
||||
events.On(events.EventQuit, func() {
|
||||
logs.Println("[DNS_NODE]", "quit unix sock")
|
||||
@@ -317,9 +335,9 @@ func (this *DNSNode) start() {
|
||||
return
|
||||
}
|
||||
|
||||
sharedNodeConfig = config
|
||||
sharedNodeConfig.Store(config)
|
||||
|
||||
configs.SharedNodeConfig = config
|
||||
configs.SharedNodeConfig.Store(config)
|
||||
events.Notify(events.EventReload)
|
||||
|
||||
sharedNodeConfigManager.reload(config)
|
||||
@@ -343,29 +361,47 @@ func (this *DNSNode) start() {
|
||||
return
|
||||
}
|
||||
|
||||
go sharedNodeConfigManager.Start()
|
||||
goman.New(func() {
|
||||
sharedNodeConfigManager.Start()
|
||||
})
|
||||
|
||||
sharedDomainManager = NewDomainManager(db, config.ClusterId)
|
||||
go sharedDomainManager.Start()
|
||||
goman.New(func() {
|
||||
sharedDomainManager.Start()
|
||||
})
|
||||
|
||||
sharedRecordManager = NewRecordManager(db)
|
||||
go sharedRecordManager.Start()
|
||||
goman.New(func() {
|
||||
sharedRecordManager.Start()
|
||||
})
|
||||
|
||||
sharedRouteManager = NewRouteManager(db)
|
||||
go sharedRouteManager.Start()
|
||||
goman.New(func() {
|
||||
sharedRouteManager.Start()
|
||||
})
|
||||
|
||||
sharedKeyManager = NewKeyManager(db)
|
||||
go sharedKeyManager.Start()
|
||||
goman.New(func() {
|
||||
sharedKeyManager.Start()
|
||||
})
|
||||
|
||||
agents.SharedManager = agents.NewManager(db)
|
||||
go agents.SharedManager.Start()
|
||||
goman.New(func() {
|
||||
agents.SharedManager.Start()
|
||||
})
|
||||
|
||||
// 发送通知,这里发送通知需要在DomainManager、RecordeManager等加载完成之后
|
||||
time.Sleep(1 * time.Second)
|
||||
// 等待所有 Manager 初始加载完成后再发送通知
|
||||
<-sharedDomainManager.readyCh
|
||||
<-sharedRecordManager.readyCh
|
||||
<-sharedRouteManager.readyCh
|
||||
<-sharedKeyManager.readyCh
|
||||
<-agents.SharedManager.ReadyCh
|
||||
events.Notify(events.EventLoaded)
|
||||
|
||||
// 启动循环
|
||||
go this.loop()
|
||||
goman.New(func() {
|
||||
this.loop()
|
||||
})
|
||||
}
|
||||
|
||||
// 更新配置Loop
|
||||
@@ -439,8 +475,9 @@ func (this *DNSNode) updateDDoS(rpcClient *rpc.RPCClient) error {
|
||||
return err
|
||||
}
|
||||
if len(resp.DdosProtectionJSON) == 0 {
|
||||
if sharedNodeConfig != nil {
|
||||
sharedNodeConfig.DDoSProtection = nil
|
||||
var cfg = dnsNodeConfig()
|
||||
if cfg != nil {
|
||||
cfg.DDoSProtection = nil
|
||||
}
|
||||
} else {
|
||||
var ddosProtectionConfig = &ddosconfigs.ProtectionConfig{}
|
||||
@@ -449,8 +486,9 @@ func (this *DNSNode) updateDDoS(rpcClient *rpc.RPCClient) error {
|
||||
return fmt.Errorf("decode DDoS protection config failed: %w", err)
|
||||
}
|
||||
|
||||
if sharedNodeConfig != nil {
|
||||
sharedNodeConfig.DDoSProtection = ddosProtectionConfig
|
||||
var cfg = dnsNodeConfig()
|
||||
if cfg != nil {
|
||||
cfg.DDoSProtection = ddosProtectionConfig
|
||||
}
|
||||
|
||||
err = firewalls.SharedDDoSProtectionManager.Apply(ddosProtectionConfig)
|
||||
|
||||
Reference in New Issue
Block a user