From 579cd6dc6469ccc141af96682fd45eb7b417738b Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 3 Dec 2022 18:14:39 +0100 Subject: [PATCH 1/4] azure: fix totally broken IsNotExist --- internal/backend/azure/azure.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/backend/azure/azure.go b/internal/backend/azure/azure.go index 7e9b64679..9e1c64c47 100644 --- a/internal/backend/azure/azure.go +++ b/internal/backend/azure/azure.go @@ -8,7 +8,6 @@ import ( "hash" "io" "net/http" - "os" "path" "strings" @@ -130,7 +129,8 @@ func (be *Backend) SetListMaxItems(i int) { // IsNotExist returns true if the error is caused by a not existing file. func (be *Backend) IsNotExist(err error) bool { debug.Log("IsNotExist(%T, %#v)", err, err) - return os.IsNotExist(err) + var aerr storage.AzureStorageServiceError + return errors.As(err, &aerr) && aerr.StatusCode == http.StatusNotFound } // Join combines path components with slashes. From 04d101fa94048f982763da0812a29b60fd35a0d6 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 3 Dec 2022 18:15:11 +0100 Subject: [PATCH 2/4] gs/s3: remove useless os.IsNotExist check --- internal/backend/gs/gs.go | 5 ----- internal/backend/s3/s3.go | 3 --- 2 files changed, 8 deletions(-) diff --git a/internal/backend/gs/gs.go b/internal/backend/gs/gs.go index 2695d3ac6..bc416cc32 100644 --- a/internal/backend/gs/gs.go +++ b/internal/backend/gs/gs.go @@ -170,11 +170,6 @@ func (be *Backend) SetListMaxItems(i int) { // IsNotExist returns true if the error is caused by a not existing file. func (be *Backend) IsNotExist(err error) bool { debug.Log("IsNotExist(%T, %#v)", err, err) - - if os.IsNotExist(err) { - return true - } - var gerr *googleapi.Error return errors.As(err, &gerr) && gerr.Code == 404 } diff --git a/internal/backend/s3/s3.go b/internal/backend/s3/s3.go index c413b9cee..58ae65f97 100644 --- a/internal/backend/s3/s3.go +++ b/internal/backend/s3/s3.go @@ -170,9 +170,6 @@ func isAccessDenied(err error) bool { // IsNotExist returns true if the error is caused by a not existing file. func (be *Backend) IsNotExist(err error) bool { debug.Log("IsNotExist(%T, %#v)", err, err) - if errors.Is(err, os.ErrNotExist) { - return true - } var e minio.ErrorResponse return errors.As(err, &e) && e.Code == "NoSuchKey" From 2f934f5803153a3c7e8f4ea7fb5c9cbd547eb3dc Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 3 Dec 2022 18:15:41 +0100 Subject: [PATCH 3/4] gs: check against the correct error in IsNotExist --- internal/backend/gs/gs.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/backend/gs/gs.go b/internal/backend/gs/gs.go index bc416cc32..77cbcda97 100644 --- a/internal/backend/gs/gs.go +++ b/internal/backend/gs/gs.go @@ -170,8 +170,7 @@ func (be *Backend) SetListMaxItems(i int) { // IsNotExist returns true if the error is caused by a not existing file. func (be *Backend) IsNotExist(err error) bool { debug.Log("IsNotExist(%T, %#v)", err, err) - var gerr *googleapi.Error - return errors.As(err, &gerr) && gerr.Code == 404 + return errors.Is(err, storage.ErrObjectNotExist) } // Join combines path components with slashes. From 2b6786242001bcc28bf2ef9bd9e084795093ddba Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 3 Dec 2022 18:22:43 +0100 Subject: [PATCH 4/4] backend/test: check that IsNotExist actually works --- internal/backend/test/tests.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/internal/backend/test/tests.go b/internal/backend/test/tests.go index 90fd9465a..b98af59c3 100644 --- a/internal/backend/test/tests.go +++ b/internal/backend/test/tests.go @@ -92,6 +92,7 @@ func (s *Suite) TestConfig(t *testing.T) { if err == nil { t.Fatalf("did not get expected error for non-existing config") } + test.Assert(t, b.IsNotExist(err), "IsNotExist() did not recognize error from LoadAll(): %v", err) err = b.Save(context.TODO(), restic.Handle{Type: restic.ConfigFile}, restic.NewByteReader([]byte(testString), b.Hasher())) if err != nil { @@ -131,11 +132,13 @@ func (s *Suite) TestLoad(t *testing.T) { if err == nil { t.Fatalf("Load() did not return an error for invalid handle") } + test.Assert(t, !b.IsNotExist(err), "IsNotExist() should not accept an invalid handle error: %v", err) err = testLoad(b, restic.Handle{Type: restic.PackFile, Name: "foobar"}, 0, 0) if err == nil { t.Fatalf("Load() did not return an error for non-existing blob") } + test.Assert(t, b.IsNotExist(err), "IsNotExist() did not recognize non-existing blob: %v", err) length := rand.Intn(1<<24) + 2000 @@ -762,6 +765,8 @@ func (s *Suite) TestBackend(t *testing.T) { b := s.open(t) defer s.close(t, b) + test.Assert(t, !b.IsNotExist(nil), "IsNotExist() recognized nil error") + for _, tpe := range []restic.FileType{ restic.PackFile, restic.KeyFile, restic.LockFile, restic.SnapshotFile, restic.IndexFile, @@ -780,10 +785,12 @@ func (s *Suite) TestBackend(t *testing.T) { // try to stat a not existing blob _, err = b.Stat(context.TODO(), h) test.Assert(t, err != nil, "blob data could be extracted before creation") + test.Assert(t, b.IsNotExist(err), "IsNotExist() did not recognize Stat() error: %v", err) // try to read not existing blob err = testLoad(b, h, 0, 0) test.Assert(t, err != nil, "blob could be read before creation") + test.Assert(t, b.IsNotExist(err), "IsNotExist() did not recognize Load() error: %v", err) // try to get string out, should fail ret, err = beTest(context.TODO(), b, h)