From f1afab5b5c7c0c829a1c5b6739a1822a99714a93 Mon Sep 17 00:00:00 2001 From: Yury Kulazhenkov Date: Thu, 26 Oct 2023 12:28:08 +0300 Subject: [PATCH] Remove systemd service result file after configuration update This is required to ensure that we will not read outdated result in edge case scenarios, e.g. when systemd service exist but for some reason was disabled by the user. Signed-off-by: Yury Kulazhenkov --- pkg/daemon/daemon.go | 15 ++++++++++++--- pkg/systemd/systemd.go | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/pkg/daemon/daemon.go b/pkg/daemon/daemon.go index df0c66323..3ec571924 100644 --- a/pkg/daemon/daemon.go +++ b/pkg/daemon/daemon.go @@ -583,13 +583,22 @@ func (dn *Daemon) nodeStateSyncHandler() error { // or there is a new config we need to apply // When using systemd configuration we write the file if dn.useSystemdService { - r, err := systemd.WriteConfFile(latestState, dn.devMode, dn.platform) + systemdConfModified, err := systemd.WriteConfFile(latestState, dn.devMode, dn.platform) if err != nil { log.Log.Error(err, "nodeStateSyncHandler(): failed to write configuration file for systemd mode") return err } - reqDrain = reqDrain || r - reqReboot = reqReboot || r + if systemdConfModified { + // remove existing result file to make sure that we will not use outdated result, e.g. in case if + // systemd service was not triggered for some reason + err = systemd.RemoveSriovResult() + if err != nil { + log.Log.Error(err, "nodeStateSyncHandler(): failed to remove result file for systemd mode") + return err + } + } + reqDrain = reqDrain || systemdConfModified + reqReboot = reqReboot || systemdConfModified log.Log.V(0).Info("nodeStateSyncHandler(): systemd mode WriteConfFile results", "drain-required", reqDrain, "reboot-required", reqReboot, "disable-drain", dn.disableDrain) diff --git a/pkg/systemd/systemd.go b/pkg/systemd/systemd.go index f32b95c8d..0bb23b576 100644 --- a/pkg/systemd/systemd.go +++ b/pkg/systemd/systemd.go @@ -209,6 +209,20 @@ func ReadSriovResult() (*SriovResult, error) { return result, err } +func RemoveSriovResult() error { + err := os.Remove(SriovHostSystemdResultPath) + if err != nil { + if os.IsNotExist(err) { + log.Log.V(2).Info("RemoveSriovResult(): result file not found") + return nil + } + log.Log.Error(err, "RemoveSriovResult(): failed to remove sriov result file", "path", SriovHostSystemdResultPath) + return err + } + log.Log.V(2).Info("RemoveSriovResult(): result file removed") + return nil +} + func WriteSriovSupportedNics() error { _, err := os.Stat(sriovHostSystemdSupportedNicPath) if err != nil {