package main import ( "context" "runtime" "git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs" httputil "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/http" "go.uber.org/zap" ) type pprofComponent struct { httpComponent blockRate int mutexRate int } const ( pprofBlockRateKey = "pprof.block_rate" pprofMutexRateKey = "pprof.mutex_rate" ) func newPprofComponent() *pprofComponent { return &pprofComponent{ httpComponent: httpComponent{ name: "pprof", handler: httputil.Handler(), }, } } func (c *pprofComponent) init(ctx context.Context) { c.httpComponent.init(ctx) if c.enabled { c.blockRate = cfg.GetInt(pprofBlockRateKey) c.mutexRate = cfg.GetInt(pprofMutexRateKey) runtime.SetBlockProfileRate(c.blockRate) runtime.SetMutexProfileFraction(c.mutexRate) } else { c.blockRate = 0 c.mutexRate = 0 runtime.SetBlockProfileRate(0) runtime.SetMutexProfileFraction(0) } } func (c *pprofComponent) needReload() bool { blockRate := cfg.GetInt(pprofBlockRateKey) mutexRate := cfg.GetInt(pprofMutexRateKey) return c.httpComponent.needReload() || c.enabled && (c.blockRate != blockRate || c.mutexRate != mutexRate) } func (c *pprofComponent) 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.String("error", err.Error())) return } c.init(ctx) c.start(ctx) } }