From a0e5fc733e412beb674f38d4b5994e443e63c937 Mon Sep 17 00:00:00 2001 From: Ekaterina Lebedeva Date: Mon, 24 Jun 2024 15:05:25 +0300 Subject: [PATCH] [#1145] node/ir: Handle double SIGHUP correctly Signed-off-by: Ekaterina Lebedeva --- cmd/frostfs-ir/config.go | 39 ++++++++++++++++++++++++---------- cmd/frostfs-node/config.go | 43 ++++++++++++++++++++++++++++---------- 2 files changed, 60 insertions(+), 22 deletions(-) diff --git a/cmd/frostfs-ir/config.go b/cmd/frostfs-ir/config.go index c3227a182..955195477 100644 --- a/cmd/frostfs-ir/config.go +++ b/cmd/frostfs-ir/config.go @@ -45,18 +45,41 @@ func reloadConfig() error { func watchForSignal(cancel func()) { ch := make(chan os.Signal, 1) - signal.Notify(ch, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) + signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM) + + sighupCh := make(chan os.Signal, 1) + signal.Notify(sighupCh, syscall.SIGHUP) for { select { - case err := <-intErr: + // signals causing application to shut down should have priority over + // reconfiguration signal + case <-ch: + log.Info(logs.FrostFSNodeTerminationSignalHasBeenReceivedStopping) + cancel() + shutdown() + log.Info(logs.FrostFSNodeTerminationSignalProcessingIsComplete) + return + case err := <-intErr: // internal application error log.Info(logs.FrostFSIRInternalError, zap.String("msg", err.Error())) cancel() shutdown() return - case sig := <-ch: - switch sig { - case syscall.SIGHUP: + default: + // block until any signal is receieved + select { + case <-ch: + log.Info(logs.FrostFSNodeTerminationSignalHasBeenReceivedStopping) + cancel() + shutdown() + log.Info(logs.FrostFSNodeTerminationSignalProcessingIsComplete) + return + case err := <-intErr: // internal application error + log.Info(logs.FrostFSIRInternalError, zap.String("msg", err.Error())) + cancel() + shutdown() + return + case <-sighupCh: log.Info(logs.FrostFSNodeSIGHUPHasBeenReceivedRereadingConfiguration) err := reloadConfig() if err != nil { @@ -70,12 +93,6 @@ func watchForSignal(cancel func()) { log.Error(logs.FrostFSNodeConfigurationReading, zap.Error(err)) } log.Info(logs.FrostFSNodeConfigurationHasBeenReloadedSuccessfully) - case syscall.SIGTERM, syscall.SIGINT: - log.Info(logs.FrostFSNodeTerminationSignalHasBeenReceivedStopping) - cancel() - shutdown() - log.Info(logs.FrostFSNodeTerminationSignalProcessingIsComplete) - return } } } diff --git a/cmd/frostfs-node/config.go b/cmd/frostfs-node/config.go index ef2c0424b..3aded7020 100644 --- a/cmd/frostfs-node/config.go +++ b/cmd/frostfs-node/config.go @@ -1224,22 +1224,22 @@ type dCmp struct { func (c *cfg) signalWatcher(ctx context.Context) { ch := make(chan os.Signal, 1) - signal.Notify(ch, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) + signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM) + + sighupCh := make(chan os.Signal, 1) + signal.Notify(sighupCh, syscall.SIGHUP) for { select { - case sig := <-ch: - switch sig { - case syscall.SIGHUP: - c.reloadConfig(ctx) - case syscall.SIGTERM, syscall.SIGINT: - c.log.Info(logs.FrostFSNodeTerminationSignalHasBeenReceivedStopping) + // signals causing application to shut down should have priority over + // reconfiguration signal + case <-ch: + c.log.Info(logs.FrostFSNodeTerminationSignalHasBeenReceivedStopping) - c.shutdown() + c.shutdown() - c.log.Info(logs.FrostFSNodeTerminationSignalProcessingIsComplete) - return - } + c.log.Info(logs.FrostFSNodeTerminationSignalProcessingIsComplete) + return case err := <-c.internalErr: // internal application error c.log.Warn(logs.FrostFSNodeInternalApplicationError, zap.String("message", err.Error())) @@ -1248,6 +1248,27 @@ func (c *cfg) signalWatcher(ctx context.Context) { c.log.Info(logs.FrostFSNodeInternalErrorProcessingIsComplete) return + default: + // block until any signal is receieved + select { + case <-sighupCh: + c.reloadConfig(ctx) + case <-ch: + c.log.Info(logs.FrostFSNodeTerminationSignalHasBeenReceivedStopping) + + c.shutdown() + + c.log.Info(logs.FrostFSNodeTerminationSignalProcessingIsComplete) + return + case err := <-c.internalErr: // internal application error + c.log.Warn(logs.FrostFSNodeInternalApplicationError, + zap.String("message", err.Error())) + + c.shutdown() + + c.log.Info(logs.FrostFSNodeInternalErrorProcessingIsComplete) + return + } } } }