Skip to content

Commit 059f6b7

Browse files
committed
Wait for bucket to become accessible after creation
S3 bucket creation in non-us-east-1 regions is eventually consistent: CreateBucket can return success while HeadBucket still returns 404 for a short window. Use the SDK's BucketExistsWaiter after CreateBucket to poll until the bucket is accessible before returning, fixing the flaky ensure-storage-exists integration test in eu-central-1. https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html#ConsistencyModel
1 parent 30705e6 commit 059f6b7

1 file changed

Lines changed: 11 additions & 3 deletions

File tree

s3/client/aws_s3_blobstore.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -303,12 +303,20 @@ func (b *awsS3Client) EnsureStorageExists() error {
303303
var alreadyExists *types.BucketAlreadyExists
304304
if errors.As(err, &alreadyOwned) || errors.As(err, &alreadyExists) {
305305
slog.Warn("Bucket got created by another process", "bucket", b.s3cliConfig.BucketName)
306-
return nil
306+
} else {
307+
return fmt.Errorf("failed to create bucket: %w", err)
307308
}
308-
return fmt.Errorf("failed to create bucket: %w", err)
309309
}
310310

311-
slog.Info("Bucket created successfully", "bucket", b.s3cliConfig.BucketName)
311+
slog.Info("Bucket created, waiting for it to be accessible", "bucket", b.s3cliConfig.BucketName)
312+
waiter := s3.NewBucketExistsWaiter(b.s3Client)
313+
if waitErr := waiter.Wait(context.TODO(), &s3.HeadBucketInput{
314+
Bucket: aws.String(b.s3cliConfig.BucketName),
315+
}, 60*time.Second); waitErr != nil {
316+
return fmt.Errorf("bucket created but did not become accessible: %w", waitErr)
317+
}
318+
319+
slog.Info("Bucket is accessible", "bucket", b.s3cliConfig.BucketName)
312320
return nil
313321
}
314322

0 commit comments

Comments
 (0)