From bb90fe2c69ceb85caaca0524cc2bf8d986a17216 Mon Sep 17 00:00:00 2001 From: diphantxm Date: Mon, 6 May 2024 12:28:59 +0300 Subject: [PATCH] add systemd notify --- coordinator/app/app.go | 27 +++++++++++++++++++++++++++ pkg/config/coordinator.go | 18 ++++++++++-------- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/coordinator/app/app.go b/coordinator/app/app.go index f56ce3e42..ee81e687e 100644 --- a/coordinator/app/app.go +++ b/coordinator/app/app.go @@ -7,6 +7,7 @@ import ( "os" "path" "sync" + "time" "github.com/pg-sharding/spqr/pkg/spqrlog" "github.com/pg-sharding/spqr/router/port" @@ -18,6 +19,7 @@ import ( "github.com/pg-sharding/spqr/coordinator/provider" "github.com/pg-sharding/spqr/pkg/config" protos "github.com/pg-sharding/spqr/pkg/protos" + sdnotifier "github.com/pg-sharding/spqr/router/sdnotifier" "golang.org/x/sync/semaphore" ) @@ -43,6 +45,20 @@ func (app *App) Run(withPsql bool) error { app.coordinator.RunCoordinator(context.TODO(), !withPsql) + var notifier *sdnotifier.Notifier + if config.CoordinatorConfig().UseSystemdNotifier { + // systemd notifier + var err error + notifier, err = sdnotifier.NewNotifier(os.Getenv("NOTIFY_SOCKET"), config.CoordinatorConfig().SystemdNotifierDebug) + if err != nil { + return err + } + + if err := notifier.Ready(); err != nil { + return fmt.Errorf("could not send ready msg: %s", err) + } + } + wg := &sync.WaitGroup{} wg.Add(1) @@ -66,6 +82,17 @@ func (app *App) Run(withPsql bool) error { } }(wg) + if notifier != nil { + go func() { + for { + if err := notifier.Notify(); err != nil { + spqrlog.Zero.Error().Err(err).Msg("error sending systemd notification") + } + time.Sleep(sdnotifier.Timeout) + } + }() + } + wg.Wait() spqrlog.Zero.Debug().Msg("exit coordinator app") diff --git a/pkg/config/coordinator.go b/pkg/config/coordinator.go index 99b79abb5..4a51e58eb 100644 --- a/pkg/config/coordinator.go +++ b/pkg/config/coordinator.go @@ -14,14 +14,16 @@ import ( var cfgCoordinator Coordinator type Coordinator struct { - LogLevel string `json:"log_level" toml:"log_level" yaml:"log_level"` - QdbAddr string `json:"qdb_addr" toml:"qdb_addr" yaml:"qdb_addr"` - CoordinatorPort string `json:"coordinator_port" toml:"coordinator_port" yaml:"coordinator_port"` - GrpcApiPort string `json:"grpc_api_port" toml:"grpc_api_port" yaml:"grpc_api_port"` - Host string `json:"host" toml:"host" yaml:"host"` - Auth *AuthCfg `json:"auth" toml:"auth" yaml:"auth"` - FrontendTLS *TLSConfig `json:"frontend_tls" yaml:"frontend_tls" toml:"frontend_tls"` - ShardDataCfg string `json:"shard_data" toml:"shard_data" yaml:"shard_data"` + LogLevel string `json:"log_level" toml:"log_level" yaml:"log_level"` + QdbAddr string `json:"qdb_addr" toml:"qdb_addr" yaml:"qdb_addr"` + CoordinatorPort string `json:"coordinator_port" toml:"coordinator_port" yaml:"coordinator_port"` + GrpcApiPort string `json:"grpc_api_port" toml:"grpc_api_port" yaml:"grpc_api_port"` + Host string `json:"host" toml:"host" yaml:"host"` + Auth *AuthCfg `json:"auth" toml:"auth" yaml:"auth"` + FrontendTLS *TLSConfig `json:"frontend_tls" yaml:"frontend_tls" toml:"frontend_tls"` + ShardDataCfg string `json:"shard_data" toml:"shard_data" yaml:"shard_data"` + UseSystemdNotifier bool `json:"use_systemd_notifier" toml:"use_systemd_notifier" yaml:"use_systemd_notifier"` + SystemdNotifierDebug bool `json:"systemd_notifier_debug" toml:"systemd_notifier_debug" yaml:"systemd_notifier_debug"` } func LoadCoordinatorCfg(cfgPath string) error {