package main import ( "context" "net/http" "time" "git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs" httputil "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/http" "go.uber.org/zap" ) type httpComponent struct { srv *httputil.Server address string name string handler http.Handler shutdownDur time.Duration enabled bool } const ( enabledKeyPostfix = ".enabled" addressKeyPostfix = ".address" shutdownTimeoutKeyPostfix = ".shutdown_timeout" ) func (c *httpComponent) init(ctx context.Context) { log.Info(ctx, "init "+c.name) c.enabled = cfg.GetBool(c.name + enabledKeyPostfix) c.address = cfg.GetString(c.name + addressKeyPostfix) c.shutdownDur = cfg.GetDuration(c.name + shutdownTimeoutKeyPostfix) if c.enabled { c.srv = httputil.New( httputil.HTTPSrvPrm{ Address: c.address, Handler: c.handler, }, httputil.WithShutdownTimeout(c.shutdownDur), ) } else { log.Info(ctx, c.name+" is disabled, skip") c.srv = nil } } func (c *httpComponent) start(ctx context.Context) { if c.srv != nil { log.Info(ctx, "start "+c.name) wg.Add(1) go func() { defer wg.Done() exitErr(c.srv.Serve()) }() } } func (c *httpComponent) shutdown(ctx context.Context) error { if c.srv != nil { log.Info(ctx, "shutdown "+c.name) return c.srv.Shutdown(ctx) } return nil } func (c *httpComponent) needReload() bool { enabled := cfg.GetBool(c.name + enabledKeyPostfix) address := cfg.GetString(c.name + addressKeyPostfix) dur := cfg.GetDuration(c.name + shutdownTimeoutKeyPostfix) return enabled != c.enabled || enabled && (address != c.address || dur != c.shutdownDur) } func (c *httpComponent) reload(ctx context.Context) { log.Info(ctx, "reload "+c.name) if c.needReload() { log.Info(ctx, c.name+" config updated") if err := c.shutdown(ctx); err != nil { log.Debug(ctx, logs.FrostFSIRCouldNotShutdownHTTPServer, zap.Error(err), ) } else { c.init(ctx) c.start(ctx) } } }