Some checks failed
Build / Build Components (push) Has been cancelled
OCI image / Build container images (push) Has been cancelled
Pre-commit hooks / Pre-commit (push) Has been cancelled
Tests and linters / Lint (push) Has been cancelled
Tests and linters / Tests (push) Has been cancelled
Tests and linters / Tests with -race (push) Has been cancelled
Tests and linters / Staticcheck (push) Has been cancelled
Tests and linters / gopls check (push) Has been cancelled
Tests and linters / Run gofumpt (push) Has been cancelled
Vulncheck / Vulncheck (push) Has been cancelled
Change-Id: Ia2a79d6cb2a5eb263fb2e6db3f9cf9f2a7d57118 Signed-off-by: Anton Nikiforov <an.nikiforov@yadro.com>
131 lines
3.6 KiB
Go
131 lines
3.6 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"os/signal"
|
|
"strconv"
|
|
"syscall"
|
|
|
|
configViper "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common/config"
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"
|
|
control "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/control/ir"
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
|
|
"github.com/spf13/cast"
|
|
"github.com/spf13/viper"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func newConfig() (*viper.Viper, error) {
|
|
var err error
|
|
dv := viper.New()
|
|
|
|
defaultConfiguration(dv)
|
|
|
|
_, err = configViper.CreateViper(configViper.WithConfigFile(*configFile),
|
|
configViper.WithConfigDir(*configDir), configViper.WithEnvPrefix(EnvPrefix),
|
|
configViper.WithViper(dv))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return dv, err
|
|
}
|
|
|
|
func reloadConfig() error {
|
|
err := configViper.ReloadViper(configViper.WithConfigFile(*configFile),
|
|
configViper.WithConfigDir(*configDir), configViper.WithEnvPrefix(EnvPrefix),
|
|
configViper.WithViper(cfg))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cmode.Store(cfg.GetBool("node.kludge_compatibility_mode"))
|
|
audit.Store(cfg.GetBool("audit.enabled"))
|
|
var logPrm logger.Prm
|
|
err = logPrm.SetLevelString(cfg.GetString("logger.level"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = logPrm.SetTags(loggerTags())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
logger.UpdateLevelForTags(logPrm)
|
|
|
|
return nil
|
|
}
|
|
|
|
func loggerTags() [][]string {
|
|
var res [][]string
|
|
for i := 0; ; i++ {
|
|
var item []string
|
|
index := strconv.FormatInt(int64(i), 10)
|
|
names := cast.ToString(cfg.Get("logger.tags." + index + ".names"))
|
|
if names == "" {
|
|
break
|
|
}
|
|
item = append(item, names, cast.ToString(cfg.Get("logger.tags."+index+".level")))
|
|
res = append(res, item)
|
|
}
|
|
return res
|
|
}
|
|
|
|
func watchForSignal(ctx context.Context, cancel func()) {
|
|
ch := make(chan os.Signal, 1)
|
|
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
sighupCh := make(chan os.Signal, 1)
|
|
signal.Notify(sighupCh, syscall.SIGHUP)
|
|
|
|
for {
|
|
select {
|
|
// signals causing application to shut down should have priority over
|
|
// reconfiguration signal
|
|
case <-ch:
|
|
log.Info(ctx, logs.FrostFSNodeTerminationSignalHasBeenReceivedStopping)
|
|
cancel()
|
|
shutdown(ctx)
|
|
log.Info(ctx, logs.FrostFSNodeTerminationSignalProcessingIsComplete)
|
|
return
|
|
case err := <-intErr: // internal application error
|
|
log.Info(ctx, logs.FrostFSIRInternalError, zap.String("msg", err.Error()))
|
|
cancel()
|
|
shutdown(ctx)
|
|
return
|
|
default:
|
|
// block until any signal is receieved
|
|
select {
|
|
case <-ch:
|
|
log.Info(ctx, logs.FrostFSNodeTerminationSignalHasBeenReceivedStopping)
|
|
cancel()
|
|
shutdown(ctx)
|
|
log.Info(ctx, logs.FrostFSNodeTerminationSignalProcessingIsComplete)
|
|
return
|
|
case err := <-intErr: // internal application error
|
|
log.Info(ctx, logs.FrostFSIRInternalError, zap.String("msg", err.Error()))
|
|
cancel()
|
|
shutdown(ctx)
|
|
return
|
|
case <-sighupCh:
|
|
log.Info(ctx, logs.FrostFSNodeSIGHUPHasBeenReceivedRereadingConfiguration)
|
|
if !innerRing.CompareAndSwapHealthStatus(ctx, control.HealthStatus_READY, control.HealthStatus_RECONFIGURING) {
|
|
log.Info(ctx, logs.FrostFSNodeSIGHUPSkip)
|
|
break
|
|
}
|
|
err := reloadConfig()
|
|
if err != nil {
|
|
log.Error(ctx, logs.FrostFSNodeConfigurationReading, zap.Error(err))
|
|
}
|
|
pprofCmp.reload(ctx)
|
|
metricsCmp.reload(ctx)
|
|
log.Info(ctx, logs.FrostFSIRReloadExtraWallets)
|
|
err = innerRing.SetExtraWallets(cfg)
|
|
if err != nil {
|
|
log.Error(ctx, logs.FrostFSNodeConfigurationReading, zap.Error(err))
|
|
}
|
|
innerRing.CompareAndSwapHealthStatus(ctx, control.HealthStatus_RECONFIGURING, control.HealthStatus_READY)
|
|
log.Info(ctx, logs.FrostFSNodeConfigurationHasBeenReloadedSuccessfully)
|
|
}
|
|
}
|
|
}
|
|
}
|