Skip to content

Commit 24f71bc

Browse files
committed
Catch context error in the s3 bucket client
Signed-off-by: Xiaochao Dong (@damnever) <[email protected]>
1 parent 50c9ccf commit 24f71bc

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## master / unreleased
44

55
* [ENHANCEMENT] Querier: Batch Iterator optimization to prevent transversing it multiple times query ranges steps does not overlap. #5237
6+
* [BUGFIX] Catch context error in the s3 bucket client. #5240
67

78
## 1.15.0 in progress
89

pkg/storage/bucket/s3/bucket_client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func (b *BucketWithRetries) retry(ctx context.Context, f func() error, operation
124124
level.Error(b.logger).Log("msg", "bucket operation fail after retries", "err", lastErr, "operation", operationInfo)
125125
return lastErr
126126
}
127-
return nil
127+
return retries.Err()
128128
}
129129

130130
func (b *BucketWithRetries) Name() string {

pkg/storage/bucket/s3/bucket_client_test.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,25 @@ func TestBucketWithRetries_UploadFailed(t *testing.T) {
7373
require.ErrorContains(t, err, "failed upload: ")
7474
}
7575

76+
func TestBucketWithRetries_ContextCanceled(t *testing.T) {
77+
t.Parallel()
78+
79+
m := mockBucket{}
80+
b := BucketWithRetries{
81+
logger: log.NewNopLogger(),
82+
bucket: &m,
83+
operationRetries: 5,
84+
retryMinBackoff: 10 * time.Millisecond,
85+
retryMaxBackoff: time.Second,
86+
}
87+
88+
ctx, cancel := context.WithCancel(context.Background())
89+
cancel()
90+
obj, err := b.GetRange(ctx, "dummy", 0, 10)
91+
require.ErrorIs(t, err, context.Canceled)
92+
require.Nil(t, obj)
93+
}
94+
7695
type fakeReader struct {
7796
}
7897

@@ -121,7 +140,7 @@ func (m *mockBucket) Get(ctx context.Context, name string) (io.ReadCloser, error
121140

122141
// GetRange mocks objstore.Bucket.GetRange()
123142
func (m *mockBucket) GetRange(ctx context.Context, name string, off, length int64) (io.ReadCloser, error) {
124-
return nil, nil
143+
return io.NopCloser(bytes.NewBuffer(bytes.Repeat([]byte{1}, int(length)))), nil
125144
}
126145

127146
// Exists mocks objstore.Bucket.Exists()

0 commit comments

Comments
 (0)