diff --git a/CHANGELOG.md b/CHANGELOG.md index 56651891723..aa6e962b490 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## main / unreleased +* [ENHANCEMENT] Make s3 backend readError logic more robust [#905](https://github.com/grafana/tempo/pull/905) (@wei840222) ## v1.1.0 / 2021-08-26 diff --git a/go.mod b/go.mod index 77fd9dc6f25..c395e320755 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/Azure/azure-pipeline-go v0.2.2 github.com/Azure/azure-storage-blob-go v0.8.0 github.com/alecthomas/kong v0.2.11 + github.com/aws/aws-sdk-go v1.38.60 github.com/cespare/xxhash v1.1.0 github.com/cortexproject/cortex v1.10.1-0.20210816080356-090988c40f3e github.com/cristalhq/hedgedhttp v0.6.0 diff --git a/tempodb/backend/s3/s3.go b/tempodb/backend/s3/s3.go index 01e7a76d7d5..c7b7b2f41af 100644 --- a/tempodb/backend/s3/s3.go +++ b/tempodb/backend/s3/s3.go @@ -12,6 +12,7 @@ import ( "github.com/grafana/tempo/tempodb/backend/instrumentation" + "github.com/aws/aws-sdk-go/service/s3" log_util "github.com/cortexproject/cortex/pkg/util/log" "github.com/cristalhq/hedgedhttp" "github.com/go-kit/kit/log" @@ -26,7 +27,6 @@ import ( ) const ( - s3KeyDoesNotExist = "The specified key does not exist." uptoHedgedRequests = 2 ) @@ -262,7 +262,7 @@ func (rw *readerWriter) readAll(ctx context.Context, name string) ([]byte, error func (rw *readerWriter) readAllWithObjInfo(ctx context.Context, name string) ([]byte, minio.ObjectInfo, error) { reader, info, _, err := rw.hedgedCore.GetObject(ctx, rw.cfg.Bucket, name, minio.GetObjectOptions{}) - if err != nil && err.Error() == s3KeyDoesNotExist { + if err != nil && minio.ToErrorResponse(err).Code == s3.ErrCodeNoSuchKey { return nil, minio.ObjectInfo{}, backend.ErrDoesNotExist } else if err != nil { return nil, minio.ObjectInfo{}, errors.Wrap(err, "error fetching object from s3 backend") @@ -359,9 +359,8 @@ func createCore(cfg *Config, hedge bool) (*minio.Core, error) { } func readError(err error) error { - if err != nil && err.Error() == s3KeyDoesNotExist { + if err != nil && minio.ToErrorResponse(err).Code == s3.ErrCodeNoSuchKey { return backend.ErrDoesNotExist } - return err } diff --git a/tempodb/backend/s3/s3_test.go b/tempodb/backend/s3/s3_test.go index eb1e7f2ee58..957c7e6dcd4 100644 --- a/tempodb/backend/s3/s3_test.go +++ b/tempodb/backend/s3/s3_test.go @@ -10,8 +10,10 @@ import ( "testing" "time" + "github.com/aws/aws-sdk-go/service/s3" "github.com/cortexproject/cortex/pkg/util/flagext" "github.com/grafana/tempo/tempodb/backend" + "github.com/minio/minio-go/v7" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -103,7 +105,9 @@ func fakeServer(t *testing.T, returnIn time.Duration, counter *int32) *httptest. } func TestReadError(t *testing.T) { - errA := fmt.Errorf(s3KeyDoesNotExist) + errA := minio.ErrorResponse{ + Code: s3.ErrCodeNoSuchKey, + } errB := readError(errA) assert.Equal(t, backend.ErrDoesNotExist, errB) diff --git a/vendor/modules.txt b/vendor/modules.txt index f5a3fa7f39d..40d14725291 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -69,6 +69,7 @@ github.com/armon/go-metrics/prometheus # github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef github.com/asaskevich/govalidator # github.com/aws/aws-sdk-go v1.38.60 +## explicit github.com/aws/aws-sdk-go/aws github.com/aws/aws-sdk-go/aws/arn github.com/aws/aws-sdk-go/aws/awserr