From 0a6e0dbdf9d8511fc25776cb7ae2ebc895d25a6a Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sun, 3 Jan 2021 20:07:02 +0100 Subject: [PATCH] Properly close CPU profile on sigint The rest server is normally shutdown via a SIGINT signal. The http handle calls are endless loops and don't return in the normal case. Thus add a signal handler to shutdown the profiler. --- cmd/rest-server/main.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/cmd/rest-server/main.go b/cmd/rest-server/main.go index 8e91358..8f02a22 100644 --- a/cmd/rest-server/main.go +++ b/cmd/rest-server/main.go @@ -6,9 +6,11 @@ import ( "log" "net/http" "os" + "os/signal" "path/filepath" "runtime" "runtime/pprof" + "syscall" restserver "github.com/restic/rest-server" "github.com/spf13/cobra" @@ -109,7 +111,18 @@ func runRoot(cmd *cobra.Command, args []string) error { return err } log.Println("CPU profiling enabled") - defer pprof.StopCPUProfile() + + // clean profiling shutdown on sigint + sigintCh := make(chan os.Signal, 1) + go func() { + for range sigintCh { + pprof.StopCPUProfile() + f.Close() + log.Println("Stopped CPU profiling") + os.Exit(130) + } + }() + signal.Notify(sigintCh, syscall.SIGINT) } handler, err := getHandler(server)