From d893e2489baacd05162ac1d7f6894fb63ec3b6dd Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte Date: Mon, 3 Jul 2023 11:10:52 +0200 Subject: [PATCH] dump config on SIGUSR1 --- cmd/revad/main.go | 2 ++ cmd/revad/pkg/config/config.go | 1 + cmd/revad/runtime/runtime.go | 42 ++++++++++++++++++++++++++++++++-- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/cmd/revad/main.go b/cmd/revad/main.go index 991073ace7a..aad02a6baf7 100644 --- a/cmd/revad/main.go +++ b/cmd/revad/main.go @@ -115,6 +115,8 @@ func handleSignalFlag() { signal = syscall.SIGQUIT case "stop": signal = syscall.SIGTERM + case "dump": + signal = syscall.SIGUSR1 default: fmt.Fprintf(os.Stderr, "unknown signal %q\n", *signalFlag) os.Exit(1) diff --git a/cmd/revad/pkg/config/config.go b/cmd/revad/pkg/config/config.go index 846b03374e1..732d6d4e7b2 100644 --- a/cmd/revad/pkg/config/config.go +++ b/cmd/revad/pkg/config/config.go @@ -59,6 +59,7 @@ type Shared struct { // Core holds the core configuration. type Core struct { MaxCPUs string `key:"max_cpus" mapstructure:"max_cpus"` + ConfigDumpFile string `key:"config_dump_file" mapstructure:"config_dump_file" default:"/tmp/reva-dump.toml"` TracingEnabled bool `key:"tracing_enabled" mapstructure:"tracing_enabled" default:"true"` TracingEndpoint string `key:"tracing_endpoint" mapstructure:"tracing_endpoint" default:"localhost:6831"` TracingCollector string `key:"tracing_collector" mapstructure:"tracing_collector"` diff --git a/cmd/revad/runtime/runtime.go b/cmd/revad/runtime/runtime.go index 3a4b6011097..e0545a98eee 100644 --- a/cmd/revad/runtime/runtime.go +++ b/cmd/revad/runtime/runtime.go @@ -21,10 +21,14 @@ package runtime import ( "fmt" "net" + "os" + "os/signal" "runtime" "strconv" "strings" + "syscall" + "github.com/BurntSushi/toml" "github.com/pkg/errors" "github.com/cs3org/reva/cmd/revad/pkg/config" @@ -115,7 +119,7 @@ func New(config *config.Config, opt ...Option) (*Reva, error) { return nil, err } - return &Reva{ + r := &Reva{ config: config, servers: servers, serverless: serverless, @@ -123,7 +127,41 @@ func New(config *config.Config, opt ...Option) (*Reva, error) { lns: listeners, pidfile: opts.PidFile, log: log, - }, nil + } + r.initConfigDumper() + return r, nil +} + +func (r *Reva) initConfigDumper() { + // dump the config when the process receives a SIGUSR1 signal + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGUSR1) + + go func() { + <-sigs + r.dumpConfig() + }() +} + +func (r *Reva) dumpConfig() { + cfg := r.config.Dump() + // TODO: merge this config with the one received from + // the running services + out := r.config.Core.ConfigDumpFile + f, err := os.OpenFile(out, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) + if err != nil { + r.log.Error().Err(err).Msgf("error opening file %s for dumping the config", out) + return + } + defer f.Close() + + enc := toml.NewEncoder(f) + enc.Indent = "" + if err := enc.Encode(cfg); err != nil { + r.log.Error().Err(err).Msg("error encoding config") + return + } + r.log.Debug().Msgf("config dumped successfully in %s", out) } func servicesAddresses(cfg *config.Config) map[string]grace.Addressable {