From afa9d17b0be6b0a6ee088e2aeb131263a8e03533 Mon Sep 17 00:00:00 2001 From: Felix Blass Date: Fri, 17 May 2024 14:07:05 +0200 Subject: [PATCH] Only delete files older than 5min --- util/configv3/load_config.go | 11 ++++++- util/configv3/load_config_test.go | 53 +++++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/util/configv3/load_config.go b/util/configv3/load_config.go index 49386ead33e..f03d3d773e1 100644 --- a/util/configv3/load_config.go +++ b/util/configv3/load_config.go @@ -7,6 +7,7 @@ import ( "math" "os" "path/filepath" + "time" "code.cloudfoundry.org/cli/command/translatableerror" "golang.org/x/crypto/ssh/terminal" @@ -177,8 +178,16 @@ func removeOldTempConfigFiles() error { } for _, oldTempFileName := range oldTempFileNames { + fi, err := os.Lstat(oldTempFileName) + // ignore if file doesn't exist anymore due to race conditions if multiple cli commands are running in parallel + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + // only delete old orphans which are not caught by the signal handler in WriteConfig + if fi.ModTime().After(time.Now().Add(-5 * time.Minute)) { + continue + } err = os.Remove(oldTempFileName) - // ignore if file doesn't exist anymore due to race conditions if multiple cli commands are running if err != nil && !errors.Is(err, os.ErrNotExist) { return err } diff --git a/util/configv3/load_config_test.go b/util/configv3/load_config_test.go index 9fdb6a9286b..36045d9bf1c 100644 --- a/util/configv3/load_config_test.go +++ b/util/configv3/load_config_test.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "os" "path/filepath" + "time" "code.cloudfoundry.org/cli/command/translatableerror" "code.cloudfoundry.org/cli/integration/helpers" @@ -60,22 +61,48 @@ var _ = Describe("Config", func() { }) When("there are old temp-config* files lingering from previous failed attempts to write the config", func() { - BeforeEach(func() { - configDir := filepath.Join(homeDir, ".cf") - Expect(os.MkdirAll(configDir, 0777)).To(Succeed()) - for i := 0; i < 3; i++ { - tmpFile, fileErr := ioutil.TempFile(configDir, "temp-config") - Expect(fileErr).ToNot(HaveOccurred()) - tmpFile.Close() - } + Context("and the files are younger than 5 minutes", func() { + BeforeEach(func() { + configDir := filepath.Join(homeDir, ".cf") + Expect(os.MkdirAll(configDir, 0777)).To(Succeed()) + for i := 0; i < 3; i++ { + configDir := filepath.Join(homeDir, ".cf") + tmpFile, fileErr := ioutil.TempFile(configDir, "temp-config") + Expect(fileErr).ToNot(HaveOccurred()) + tmpFile.Close() + } + }) + + It("keeps the files", func() { + Expect(loadErr).ToNot(HaveOccurred()) + + oldTempFileNames, configErr := filepath.Glob(filepath.Join(homeDir, ".cf", "temp-config?*")) + Expect(configErr).ToNot(HaveOccurred()) + Expect(oldTempFileNames).To(HaveLen(3)) + }) }) - It("removes the lingering temp-config* files", func() { - Expect(loadErr).ToNot(HaveOccurred()) + Context("and the files are older than 5 minutes", func() { + BeforeEach(func() { + configDir := filepath.Join(homeDir, ".cf") + Expect(os.MkdirAll(configDir, 0777)).To(Succeed()) + for i := 0; i < 3; i++ { + tmpFile, fileErr := ioutil.TempFile(configDir, "temp-config") + Expect(fileErr).ToNot(HaveOccurred()) + tmpFile.Close() + oldTime := time.Now().Add(-time.Minute * 10) + err := os.Chtimes(tmpFile.Name(), oldTime, oldTime) + Expect(err).ToNot(HaveOccurred()) + } + }) - oldTempFileNames, configErr := filepath.Glob(filepath.Join(homeDir, ".cf", "temp-config?*")) - Expect(configErr).ToNot(HaveOccurred()) - Expect(oldTempFileNames).To(BeEmpty()) + It("removes the lingering temp-config* files", func() { + Expect(loadErr).ToNot(HaveOccurred()) + + oldTempFileNames, configErr := filepath.Glob(filepath.Join(homeDir, ".cf", "temp-config?*")) + Expect(configErr).ToNot(HaveOccurred()) + Expect(oldTempFileNames).To(BeEmpty()) + }) }) })