Skip to content

Commit 39cdcbf

Browse files
authored
external: improve S3 error message (#59327)
close #59326
1 parent 002a1a7 commit 39cdcbf

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
@@ -512,8 +512,14 @@ func (rs *KS3Storage) open(
512512
}
513513

514514
if startOffset != r.Start || (endOffset != 0 && endOffset != r.End+1) {
515-
return nil, r, errors.Annotatef(berrors.ErrStorageUnknown, "open file '%s' failed, expected range: %s, got: %v",
516-
path, *rangeOffset, result.ContentRange)
515+
rangeStr := "<empty>"
516+
if result.ContentRange != nil {
517+
rangeStr = *result.ContentRange
518+
}
519+
return nil, r, errors.Annotatef(
520+
berrors.ErrStorageUnknown,
521+
"open file '%s' failed, expected range: %s, got: %s",
522+
path, *rangeOffset, rangeStr)
517523
}
518524

519525
return result.Body, r, nil

br/pkg/storage/s3.go

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

877877
if startOffset != r.Start || (endOffset != 0 && endOffset != r.End+1) {
878-
return nil, r, errors.Annotatef(berrors.ErrStorageUnknown, "open file '%s' failed, expected range: %s, got: %v",
879-
path, *rangeOffset, result.ContentRange)
878+
rangeStr := "<empty>"
879+
if result.ContentRange != nil {
880+
rangeStr = *result.ContentRange
881+
}
882+
return nil, r, errors.Annotatef(berrors.ErrStorageUnknown,
883+
"open file '%s' failed, expected range: %s, got: %s",
884+
path, *rangeOffset, rangeStr)
880885
}
881886

882887
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
@@ -1472,3 +1472,30 @@ func TestS3ReadFileRetryable(t *testing.T) {
14721472
require.Error(t, err)
14731473
require.True(t, strings.Contains(err.Error(), errMsg))
14741474
}
1475+
1476+
func TestOpenRangeMismatchErrorMsg(t *testing.T) {
1477+
s := createS3Suite(t)
1478+
ctx := aws.BackgroundContext()
1479+
start, end := int64(10), int64(30)
1480+
1481+
s.s3.EXPECT().
1482+
GetObjectWithContext(ctx, gomock.Any()).
1483+
DoAndReturn(func(context.Context, *s3.GetObjectInput, ...request.Option) (*s3.GetObjectOutput, error) {
1484+
return &s3.GetObjectOutput{
1485+
ContentRange: aws.String("bytes 10-20/20"),
1486+
}, nil
1487+
})
1488+
reader, err := s.storage.Open(ctx, "test", &ReaderOption{StartOffset: &start, EndOffset: &end})
1489+
require.ErrorContains(t, err, "expected range: bytes=10-29, got: bytes 10-20/20")
1490+
require.Nil(t, reader)
1491+
1492+
s.s3.EXPECT().
1493+
GetObjectWithContext(ctx, gomock.Any()).
1494+
DoAndReturn(func(context.Context, *s3.GetObjectInput, ...request.Option) (*s3.GetObjectOutput, error) {
1495+
return &s3.GetObjectOutput{}, nil
1496+
})
1497+
reader, err = s.storage.Open(ctx, "test", &ReaderOption{StartOffset: &start, EndOffset: &end})
1498+
// other function will throw error
1499+
require.ErrorContains(t, err, "ContentRange is empty")
1500+
require.Nil(t, reader)
1501+
}

0 commit comments

Comments
 (0)