diff --git a/server/agentmanager/PAgentMap.go b/server/agentmanager/PAgentMap.go index d4d38efee0b03afe59c707874d7eac2e598a4ada..1c3fd2f1d15e6bdd4da5b27c4adead8386960d20 100644 --- a/server/agentmanager/PAgentMap.go +++ b/server/agentmanager/PAgentMap.go @@ -31,11 +31,11 @@ func WaitingForHandshake() { } func Wait4TopoServerReady() { - defer global.Global_wg.Done() - global.Global_wg.Add(1) + defer global.END.Wg.Done() + global.END.Wg.Add(1) for { select { - case <-global.Global_cancelCtx.Done(): + case <-global.END.CancelCtx.Done(): break default: url := "http://" + conf.Global_Config.Topo.Addr + "/plugin_manage/info" diff --git a/server/db/dbmanager.go b/server/db/dbmanager.go index 046d41f39d04107738c110bd2b6c8acdf1df5837..1c701d2c52a76046d2a7b707ac43d1522d4acd27 100644 --- a/server/db/dbmanager.go +++ b/server/db/dbmanager.go @@ -91,12 +91,12 @@ func ClearGraphData(retention int64) { graphmanager.Global_GraphDB.ClearExpiredData(retention) - global.Global_wg.Add(1) + global.END.Wg.Add(1) go func() { - defer global.Global_wg.Done() + defer global.END.Wg.Done() for { select { - case <-global.Global_cancelCtx.Done(): + case <-global.END.CancelCtx.Done(): return default: current := time.Now() diff --git a/server/errormanager/errormanager.go b/server/errormanager/errormanager.go index a666c9982bef724bb1708c72f16f109c73dc0aaf..b2cadea828edaebf5483914d0b1044330cf11af3 100644 --- a/server/errormanager/errormanager.go +++ b/server/errormanager/errormanager.go @@ -12,6 +12,26 @@ import ( "github.com/pkg/errors" ) +type ResourceReleaseIface interface { + Close() +} + +type FinalError struct { + Err error + + Severity string + + Cancel context.CancelFunc + + PrintStack bool + + ExitAfterPrint bool +} + +func (e *FinalError) Error() string { + return e.Err.Error() +} + var ErrorManager *ErrorManagement type ErrorManagement struct { @@ -21,14 +41,16 @@ type ErrorManagement struct { cancelCtx context.Context cancelFunc context.CancelFunc + + end ResourceReleaseIface } -func CreateErrorManager() { +func CreateErrorManager(_end ResourceReleaseIface) { ErrorManager = &ErrorManagement{ ErrCh: make(chan error, 20), + end: _end, } - - ErrorManager.cancelCtx, ErrorManager.cancelFunc = context.WithCancel(global.Global_cancelCtx) + ErrorManager.cancelCtx, ErrorManager.cancelFunc = context.WithCancel(global.END.CancelCtx) switch conf.Global_Config.Logopts.Driver { case "stdout": @@ -41,9 +63,9 @@ func CreateErrorManager() { ErrorManager.out = logfile } - global.Global_wg.Add(1) + global.END.Wg.Add(1) go func(ch <-chan error) { - defer global.Global_wg.Done() + defer global.END.Wg.Done() for { select { case <-ErrorManager.cancelCtx.Done(): @@ -96,3 +118,40 @@ func CreateErrorManager() { } }(ErrorManager.ErrCh) } + +/* +@ctx: 插件服务端初始上下文(默认为pluginclient.Global_Context) + +@err: 最终生成的error + +@exit_after_print: 打印完错误链信息后是否结束主程序 +*/ +func ErrorTransmit(_severity string, _err error, _exit_after_print, _print_stack bool) { + if ErrorManager == nil { + logger.Error("globalerrormanager is nil") + ErrorManager.end.Close() + os.Exit(1) + } + + if _exit_after_print { + ctx, cancel := context.WithCancel(ErrorManager.cancelCtx) + ErrorManager.ErrCh <- &FinalError{ + Err: _err, + Cancel: cancel, + Severity: _severity, + PrintStack: _print_stack, + ExitAfterPrint: _exit_after_print, + } + <-ctx.Done() + close(ErrorManager.ErrCh) + ErrorManager.end.Close() + os.Exit(1) + } + + ErrorManager.ErrCh <- &FinalError{ + Err: _err, + PrintStack: _print_stack, + ExitAfterPrint: _exit_after_print, + Cancel: nil, + } +} diff --git a/server/errormanager/meta.go b/server/errormanager/meta.go deleted file mode 100644 index fdea675b2aa05bb743aa7c278d65168fcec5a5eb..0000000000000000000000000000000000000000 --- a/server/errormanager/meta.go +++ /dev/null @@ -1,62 +0,0 @@ -package errormanager - -import ( - "context" - "os" - - "gitee.com/openeuler/PilotGo-plugin-topology/server/global" - "gitee.com/openeuler/PilotGo/sdk/logger" -) - -type FinalError struct { - Err error - - Severity string - - Cancel context.CancelFunc - - PrintStack bool - - ExitAfterPrint bool -} - -func (e *FinalError) Error() string { - return e.Err.Error() -} - -/* -@ctx: 插件服务端初始上下文(默认为pluginclient.Global_Context) - -@err: 最终生成的error - -@exit_after_print: 打印完错误链信息后是否结束主程序 -*/ -func ErrorTransmit(_severity string, _err error, _exit_after_print, _print_stack bool) { - if ErrorManager == nil { - logger.Error("globalerrormanager is nil") - global.Close() - os.Exit(1) - } - - if _exit_after_print { - ctx, cancel := context.WithCancel(ErrorManager.cancelCtx) - ErrorManager.ErrCh <- &FinalError{ - Err: _err, - Cancel: cancel, - Severity: _severity, - PrintStack: _print_stack, - ExitAfterPrint: _exit_after_print, - } - <-ctx.Done() - close(ErrorManager.ErrCh) - global.Close() - os.Exit(1) - } - - ErrorManager.ErrCh <- &FinalError{ - Err: _err, - PrintStack: _print_stack, - ExitAfterPrint: _exit_after_print, - Cancel: nil, - } -} diff --git a/server/global/close.go b/server/global/close.go index d60843a9ccadd00d348d92efcacd32f14f02265b..ca56c5e383d2b9635f26b7bbb9172f298d1c6181 100644 --- a/server/global/close.go +++ b/server/global/close.go @@ -1,12 +1,31 @@ package global import ( + "context" "fmt" + "sync" "gitee.com/openeuler/PilotGo/sdk/logger" ) -func Close() { +var END *ResourceRelease + +func init() { + ctx, cancel := context.WithCancel(RootContext) + END = &ResourceRelease{ + CancelCtx: ctx, + CancelFunc: cancel, + } +} + +type ResourceRelease struct { + Wg sync.WaitGroup + + CancelCtx context.Context + CancelFunc context.CancelFunc +} + +func (rr *ResourceRelease) Close() { switch Global_graph_database { case "neo4j": if Global_neo4j_driver != nil { @@ -26,7 +45,7 @@ func Close() { logger.Info("close the connection to influx\n") } - Global_cancelFunc() + rr.CancelFunc() - Global_wg.Wait() + rr.Wg.Wait() } diff --git a/server/global/global.go b/server/global/global.go index 63f93453ac38eb123f2528677da8b4cd426753bd..0073ff4b0f5157de1aaaf81928ad24c92381cac0 100755 --- a/server/global/global.go +++ b/server/global/global.go @@ -2,7 +2,6 @@ package global import ( "context" - "sync" "github.com/go-redis/redis/v8" influx "github.com/influxdata/influxdb-client-go/v2" @@ -15,11 +14,8 @@ var ( DEFAULT_TAGS []string ) -var Global_wg sync.WaitGroup - var ( - RootContext = context.Background() - Global_cancelCtx, Global_cancelFunc = context.WithCancel(context.Background()) + RootContext = context.Background() ) var ( diff --git a/server/handler/router.go b/server/handler/router.go index b236cb919fdd4df1cb1cfe4645d7c85f703c717f..27b239457619e8c87d039f9aae0c64b4abfc588a 100644 --- a/server/handler/router.go +++ b/server/handler/router.go @@ -34,9 +34,9 @@ func InitWebServer() { Handler: engine, } - global.Global_wg.Add(1) + global.END.Wg.Add(1) go func() { - defer global.Global_wg.Done() + defer global.END.Wg.Done() if conf.Global_Config.Topo.Https_enabled { if err := webserver.ListenAndServeTLS(conf.Global_Config.Topo.Addr, conf.Global_Config.Topo.Public_certificate, conf.Global_Config.Topo.Private_key); err != nil { @@ -51,8 +51,8 @@ func InitWebServer() { }() go func() { - <-global.Global_cancelCtx.Done() - + <-global.END.CancelCtx.Done() + logger.Info("shutting down web server...") ctx, cancel := context.WithTimeout(global.RootContext, 1*time.Second) diff --git a/server/main.go b/server/main.go index 8c2009237422ee839fdcaefbe0f0bd8a980cc665..bb1d9c53360819b9d82cde40c0cafa9d5001a796 100755 --- a/server/main.go +++ b/server/main.go @@ -6,6 +6,7 @@ import ( "gitee.com/openeuler/PilotGo-plugin-topology/server/db" "gitee.com/openeuler/PilotGo-plugin-topology/server/db/mysqlmanager" "gitee.com/openeuler/PilotGo-plugin-topology/server/errormanager" + "gitee.com/openeuler/PilotGo-plugin-topology/server/global" "gitee.com/openeuler/PilotGo-plugin-topology/server/handler" "gitee.com/openeuler/PilotGo-plugin-topology/server/logger" "gitee.com/openeuler/PilotGo-plugin-topology/server/pluginclient" @@ -34,7 +35,7 @@ func main() { /* init error control */ - errormanager.CreateErrorManager() + errormanager.CreateErrorManager(global.END) /* init agent manager diff --git a/server/service/periodcollect.go b/server/service/periodcollect.go index 110575226236c77b948b9043d3db6933f4e654b3..6660156ed7301d3bcc259c6e8b7672c7682277c4 100644 --- a/server/service/periodcollect.go +++ b/server/service/periodcollect.go @@ -44,12 +44,12 @@ func InitPeriodCollectWorking(batch []string, noderules [][]mysqlmanager.Filter_ agentmanager.Global_AgentManager.UpdateMachineList() - global.Global_wg.Add(1) + global.END.Wg.Add(1) go func(_interval int64, _gdb graphmanager.GraphdbIface, _noderules [][]mysqlmanager.Filter_rule) { - defer global.Global_wg.Done() + defer global.END.Wg.Done() for { select { - case <-global.Global_cancelCtx.Done(): + case <-global.END.CancelCtx.Done(): logger.Info("cancelCtx is done, exit period collect goroutine") return default: diff --git a/server/signal/signalMonitor.go b/server/signal/signalMonitor.go index fa18558d6f7385e71902f045088ffe5ca7b6a45c..f688a0f25300a32ab9abf95c6924aa86b48e29fb 100644 --- a/server/signal/signalMonitor.go +++ b/server/signal/signalMonitor.go @@ -16,7 +16,7 @@ func SignalMonitoring() { for s := range ch { switch s { case syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT: - global.Close() + global.END.Close() os.Exit(1) default: logger.Warn("unknown signal-> %s\n", s.String())