From 361451eaf330ad9405e4ab55c0d16cb3d1fc69f9 Mon Sep 17 00:00:00 2001 From: joshjennings98 Date: Fri, 1 Aug 2025 09:35:54 +0100 Subject: [PATCH 1/4] :bug: `filsystem` Unlink files before attempting to remove them in Remove --- changes/20250801093542.bugfix | 1 + utils/filesystem/extendedosfs.go | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 changes/20250801093542.bugfix diff --git a/changes/20250801093542.bugfix b/changes/20250801093542.bugfix new file mode 100644 index 0000000000..814844bdfc --- /dev/null +++ b/changes/20250801093542.bugfix @@ -0,0 +1 @@ +:bug: `filsystem` Unlink files before attempting to remove them in Remove diff --git a/utils/filesystem/extendedosfs.go b/utils/filesystem/extendedosfs.go index ba01768311..d919c1522d 100644 --- a/utils/filesystem/extendedosfs.go +++ b/utils/filesystem/extendedosfs.go @@ -22,13 +22,14 @@ type ExtendedOsFs struct { } func (c *ExtendedOsFs) Remove(name string) (err error) { - err = commonerrors.Ignore(ConvertFileSystemError(c.OsFs.Remove(name)), commonerrors.ErrNotFound) - if err != nil { - return - } // The following is to ensure sockets are correctly removed // https://stackoverflow.com/questions/16681944/how-to-reliably-unlink-a-unix-domain-socket-in-go-programming-language err = commonerrors.Ignore(ConvertFileSystemError(syscall.Unlink(name)), commonerrors.ErrNotFound) + if err != nil { + return + } + + err = commonerrors.Ignore(ConvertFileSystemError(c.OsFs.Remove(name)), commonerrors.ErrNotFound) return } From 2c87cb789325dabee49fd1316cae491a49c84366 Mon Sep 17 00:00:00 2001 From: joshjennings98 Date: Fri, 1 Aug 2025 10:15:54 +0100 Subject: [PATCH 2/4] ignore is a directory error in unlink --- utils/filesystem/extendedosfs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/filesystem/extendedosfs.go b/utils/filesystem/extendedosfs.go index d919c1522d..b922ae0051 100644 --- a/utils/filesystem/extendedosfs.go +++ b/utils/filesystem/extendedosfs.go @@ -25,7 +25,7 @@ func (c *ExtendedOsFs) Remove(name string) (err error) { // The following is to ensure sockets are correctly removed // https://stackoverflow.com/questions/16681944/how-to-reliably-unlink-a-unix-domain-socket-in-go-programming-language err = commonerrors.Ignore(ConvertFileSystemError(syscall.Unlink(name)), commonerrors.ErrNotFound) - if err != nil { + if err != nil && !commonerrors.CorrespondTo(err, "is a directory") { return } From a11986c8f06d032690686612a7c4947257139d80 Mon Sep 17 00:00:00 2001 From: joshjennings98 Date: Fri, 1 Aug 2025 10:50:28 +0100 Subject: [PATCH 3/4] :sparkles: `commonerrors` Add IgnoreCorrespondTo function --- changes/20250801105019.feature | 1 + utils/commonerrors/errors.go | 8 ++++++++ utils/commonerrors/errors_test.go | 7 +++++++ utils/filesystem/extendedosfs.go | 3 ++- 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 changes/20250801105019.feature diff --git a/changes/20250801105019.feature b/changes/20250801105019.feature new file mode 100644 index 0000000000..22c5a3e63e --- /dev/null +++ b/changes/20250801105019.feature @@ -0,0 +1 @@ +:sparkles: `commonerrors` Add IgnoreCorrespondTo function diff --git a/utils/commonerrors/errors.go b/utils/commonerrors/errors.go index 7eabf99247..0d63919f0c 100644 --- a/utils/commonerrors/errors.go +++ b/utils/commonerrors/errors.go @@ -255,6 +255,14 @@ func Ignore(target error, ignore ...error) error { return target } +// IgnoreCorrespondTo will return nil if the target error matches one of the errors to ignore +func IgnoreCorrespondTo(target error, ignore ...string) error { + if CorrespondTo(target, ignore...) { + return nil + } + return target +} + // IsEmpty states whether an error is empty or not. // An error is considered empty if it is `nil` or has no description. func IsEmpty(err error) bool { diff --git a/utils/commonerrors/errors_test.go b/utils/commonerrors/errors_test.go index b6a495e1b3..dc5227cf6b 100644 --- a/utils/commonerrors/errors_test.go +++ b/utils/commonerrors/errors_test.go @@ -49,6 +49,13 @@ func TestCorrespondTo(t *testing.T) { assert.True(t, CorrespondTo(fmt.Errorf("%v %v", faker.Sentence(), strings.ToUpper(ErrUndefined.Error())), strings.ToLower(ErrUndefined.Error()))) } +func TestIgnoreCorrespondTo(t *testing.T) { + assert.NoError(t, IgnoreCorrespondTo(errors.New("test"), "test")) + assert.NoError(t, IgnoreCorrespondTo(errors.New("test 123"), "test")) + assert.Error(t, IgnoreCorrespondTo(errors.New("test 123"), "abc", "def", faker.Word())) + assert.NoError(t, IgnoreCorrespondTo(ErrCondition, "condition")) +} + func TestContextErrorConversion(t *testing.T) { defer goleak.VerifyNone(t) task := func(ctx context.Context) { diff --git a/utils/filesystem/extendedosfs.go b/utils/filesystem/extendedosfs.go index b922ae0051..b79b727095 100644 --- a/utils/filesystem/extendedosfs.go +++ b/utils/filesystem/extendedosfs.go @@ -25,7 +25,8 @@ func (c *ExtendedOsFs) Remove(name string) (err error) { // The following is to ensure sockets are correctly removed // https://stackoverflow.com/questions/16681944/how-to-reliably-unlink-a-unix-domain-socket-in-go-programming-language err = commonerrors.Ignore(ConvertFileSystemError(syscall.Unlink(name)), commonerrors.ErrNotFound) - if err != nil && !commonerrors.CorrespondTo(err, "is a directory") { + err = commonerrors.IgnoreCorrespondTo(err, "is a directory") + if err != nil { return } From d99c4690eeda241b4a8e7f1fff8bee35828f23cd Mon Sep 17 00:00:00 2001 From: Adrien CABARBAYE Date: Fri, 1 Aug 2025 11:02:33 +0100 Subject: [PATCH 4/4] Update utils/commonerrors/errors.go --- utils/commonerrors/errors.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/commonerrors/errors.go b/utils/commonerrors/errors.go index 0d63919f0c..34d23f3402 100644 --- a/utils/commonerrors/errors.go +++ b/utils/commonerrors/errors.go @@ -255,7 +255,7 @@ func Ignore(target error, ignore ...error) error { return target } -// IgnoreCorrespondTo will return nil if the target error matches one of the errors to ignore +// IgnoreCorrespondTo will return nil if the target error matches one of the descriptions of errors to ignore func IgnoreCorrespondTo(target error, ignore ...string) error { if CorrespondTo(target, ignore...) { return nil