diff --git a/pkg/storage/chunk/client/aws/s3_storage_client.go b/pkg/storage/chunk/client/aws/s3_storage_client.go index 843b7fe7302d..11696f67eddb 100644 --- a/pkg/storage/chunk/client/aws/s3_storage_client.go +++ b/pkg/storage/chunk/client/aws/s3_storage_client.go @@ -501,7 +501,13 @@ func (a *S3ObjectClient) List(ctx context.Context, prefix, delimiter string) ([] // IsObjectNotFoundErr returns true if error means that object is not found. Relevant to GetObject and DeleteObject operations. func (a *S3ObjectClient) IsObjectNotFoundErr(err error) bool { - if aerr, ok := errors.Cause(err).(awserr.Error); ok && aerr.Code() == s3.ErrCodeNoSuchKey { + aerr, ok := errors.Cause(err).(awserr.Error) + if !ok { + return false + } + + code := aerr.Code() + if code == s3.ErrCodeNoSuchKey || code == "NotFound" { return true } diff --git a/pkg/storage/chunk/client/aws/s3_storage_client_test.go b/pkg/storage/chunk/client/aws/s3_storage_client_test.go index db9ba83c6183..d966f1a2f9f9 100644 --- a/pkg/storage/chunk/client/aws/s3_storage_client_test.go +++ b/pkg/storage/chunk/client/aws/s3_storage_client_test.go @@ -23,6 +23,7 @@ import ( "github.com/grafana/loki/v3/pkg/storage/chunk/client/hedging" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3iface" @@ -34,6 +35,44 @@ func (f RoundTripperFunc) RoundTrip(req *http.Request) (*http.Response, error) { return f(req) } +func TestIsObjectNotFoundErr(t *testing.T) { + tests := []struct { + err error + expected bool + name string + }{ + { + name: "no such key error is recognized as object not found", + err: awserr.New(s3.ErrCodeNoSuchKey, "NoSuchKey", nil), + expected: true, + }, + { + name: "NotFound code is recognized as object not found", + err: awserr.New("NotFound", "NotFound", nil), + expected: true, + }, + { + name: "Nil error isnt recognized as object not found", + err: nil, + expected: false, + }, + { + name: "Other error isnt recognized as object not found", + err: awserr.New(s3.ErrCodeNoSuchBucket, "NoSuchBucket", nil), + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client, err := NewS3ObjectClient(S3Config{BucketNames: "mybucket"}, hedging.Config{}) + require.NoError(t, err) + + require.Equal(t, tt.expected, client.IsObjectNotFoundErr(tt.err)) + }) + } +} + func TestRequestMiddleware(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, r.Header.Get("echo-me"))