From b8a7709fdea0f1c2204efb7b7082000606d4aa18 Mon Sep 17 00:00:00 2001 From: Pavel Karpy Date: Tue, 22 Oct 2024 20:38:45 +0300 Subject: [PATCH] node/pprof,metrics: make them stop at the end of app life Like 85b31b91735a2a78af0f615caa08a371127bdf1d but for shutdown order. In practice, there was an SN app that could not stop, but it was impossible to debug anything because no pprof or metrics were available. Closes #2976. Signed-off-by: Pavel Karpy --- CHANGELOG.md | 1 + cmd/neofs-node/config.go | 3 +++ cmd/neofs-node/main.go | 5 ++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a499e2280b..4aa8da852d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,7 @@ notes) if you've not done it previously. - `ObjectService`'s `Search` and `Replicate` RPC handlers cache up to 1000 lists of container nodes (#2892) - Default max_traceable_blocks Morph setting lowered to 17280 from 2102400 (#2897) - `ObjectService`'s `Get`/`Head`/`GetRange` RPC handlers cache up to 10K lists of per-object sorted container nodes (#2896) +- Pprof and metrics services stop at the end of SN's application lifecycle (#2976) ### Updated - neofs-contract dependency to 0.20.0 (#2872) diff --git a/cmd/neofs-node/config.go b/cmd/neofs-node/config.go index 8392279526..68fe7ef41a 100644 --- a/cmd/neofs-node/config.go +++ b/cmd/neofs-node/config.go @@ -285,6 +285,9 @@ type internals struct { wg *sync.WaitGroup workers []worker closers []func() + // services that are useful for debug (e.g. when a regular closer does not + // close), must be close at the very end of application life cycle + veryLastClosers []func() apiVersion version.Version healthStatus atomic.Int32 diff --git a/cmd/neofs-node/main.go b/cmd/neofs-node/main.go index 35a2356edc..726ad81aa5 100644 --- a/cmd/neofs-node/main.go +++ b/cmd/neofs-node/main.go @@ -97,7 +97,7 @@ func preRunAndLog(c *cfg, name string, srv *httputil.Server) { }) }() - c.closers = append(c.closers, func() { + c.closers = append(c.veryLastClosers, func() { c.log.Debug(fmt.Sprintf("shutting down %s service", name)) err := srv.Shutdown() @@ -185,6 +185,9 @@ func shutdown(c *cfg) { for _, closer := range c.closers { closer() } + for _, lastCloser := range c.veryLastClosers { + lastCloser() + } c.log.Debug("waiting for all processes to stop")