Skip to content

Commit db55e5e

Browse files
authored
external: improve S3 error message (#59327) (#59749)
close #59326
1 parent e34e953 commit db55e5e

File tree

3 files changed

+42
-4
lines changed

3 files changed

+42
-4
lines changed

br/pkg/storage/ks3.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -502,8 +502,14 @@ func (rs *KS3Storage) open(
502502
}
503503

504504
if startOffset != r.Start || (endOffset != 0 && endOffset != r.End+1) {
505-
return nil, r, errors.Annotatef(berrors.ErrStorageUnknown, "open file '%s' failed, expected range: %s, got: %v",
506-
path, *rangeOffset, result.ContentRange)
505+
rangeStr := "<empty>"
506+
if result.ContentRange != nil {
507+
rangeStr = *result.ContentRange
508+
}
509+
return nil, r, errors.Annotatef(
510+
berrors.ErrStorageUnknown,
511+
"open file '%s' failed, expected range: %s, got: %s",
512+
path, *rangeOffset, rangeStr)
507513
}
508514

509515
return result.Body, r, nil

br/pkg/storage/s3.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -846,8 +846,13 @@ func (rs *S3Storage) open(
846846
}
847847

848848
if startOffset != r.Start || (endOffset != 0 && endOffset != r.End+1) {
849-
return nil, r, errors.Annotatef(berrors.ErrStorageUnknown, "open file '%s' failed, expected range: %s, got: %v",
850-
path, *rangeOffset, result.ContentRange)
849+
rangeStr := "<empty>"
850+
if result.ContentRange != nil {
851+
rangeStr = *result.ContentRange
852+
}
853+
return nil, r, errors.Annotatef(berrors.ErrStorageUnknown,
854+
"open file '%s' failed, expected range: %s, got: %s",
855+
path, *rangeOffset, rangeStr)
851856
}
852857

853858
return result.Body, r, nil

br/pkg/storage/s3_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1421,3 +1421,30 @@ func TestS3ReadFileRetryable(t *testing.T) {
14211421
require.Error(t, err)
14221422
require.True(t, strings.Contains(err.Error(), errMsg))
14231423
}
1424+
1425+
func TestOpenRangeMismatchErrorMsg(t *testing.T) {
1426+
s := createS3Suite(t)
1427+
ctx := aws.BackgroundContext()
1428+
start, end := int64(10), int64(30)
1429+
1430+
s.s3.EXPECT().
1431+
GetObjectWithContext(ctx, gomock.Any()).
1432+
DoAndReturn(func(context.Context, *s3.GetObjectInput, ...request.Option) (*s3.GetObjectOutput, error) {
1433+
return &s3.GetObjectOutput{
1434+
ContentRange: aws.String("bytes 10-20/20"),
1435+
}, nil
1436+
})
1437+
reader, err := s.storage.Open(ctx, "test", &ReaderOption{StartOffset: &start, EndOffset: &end})
1438+
require.ErrorContains(t, err, "expected range: bytes=10-29, got: bytes 10-20/20")
1439+
require.Nil(t, reader)
1440+
1441+
s.s3.EXPECT().
1442+
GetObjectWithContext(ctx, gomock.Any()).
1443+
DoAndReturn(func(context.Context, *s3.GetObjectInput, ...request.Option) (*s3.GetObjectOutput, error) {
1444+
return &s3.GetObjectOutput{}, nil
1445+
})
1446+
reader, err = s.storage.Open(ctx, "test", &ReaderOption{StartOffset: &start, EndOffset: &end})
1447+
// other function will throw error
1448+
require.ErrorContains(t, err, "ContentRange is empty")
1449+
require.Nil(t, reader)
1450+
}

0 commit comments

Comments
 (0)