From 66bb9acfe592a255c0c6b202e3e3811da3341b39 Mon Sep 17 00:00:00 2001 From: sinkingpoint Date: Wed, 8 Nov 2023 11:36:03 +1100 Subject: [PATCH] Allow turning off checksums in S3 Puts https://github.com/thanos-io/thanos/pull/6746 bumped objstore, which bumped minio, which made Thanos incompatible with otherwise compliant S3 backends that do not support the x-amz-checksum header. This adds in a `SendChecksum` (open to naming changes) config entry to the S3 bucket config that allows turning off this header so that Thanos supports these backends. Signed-off-by: sinkingpoint --- providers/s3/s3.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/providers/s3/s3.go b/providers/s3/s3.go index 83e3a2de..8d9689e4 100644 --- a/providers/s3/s3.go +++ b/providers/s3/s3.go @@ -113,6 +113,7 @@ var DefaultConfig = Config{ }, PartSize: 1024 * 1024 * 64, // 64MB. BucketLookupType: AutoLookup, + SendChecksum: true, } // HTTPConfig exists here only because Cortex depends on it, and we depend on Cortex. @@ -136,6 +137,7 @@ type Config struct { TraceConfig TraceConfig `yaml:"trace"` ListObjectsVersion string `yaml:"list_objects_version"` BucketLookupType BucketLookupType `yaml:"bucket_lookup_type"` + SendChecksum bool `yaml:"send_checksum"` // PartSize used for multipart upload. Only used if uploaded object size is known and larger than configured PartSize. // NOTE we need to make sure this number does not produce more parts than 10 000. PartSize uint64 `yaml:"part_size"` @@ -166,6 +168,7 @@ type Bucket struct { storageClass string partSize uint64 listObjectsV1 bool + sendChecksum bool } // parseConfig unmarshals a buffer into a Config with default values. @@ -334,6 +337,7 @@ func NewBucketWithConfig(logger log.Logger, config Config, component string) (*B storageClass: storageClass, partSize: config.PartSize, listObjectsV1: config.ListObjectsVersion == "v1", + sendChecksum: config.SendChecksum, } return bkt, nil } @@ -510,6 +514,7 @@ func (b *Bucket) Upload(ctx context.Context, name string, r io.Reader) error { ServerSideEncryption: sse, UserMetadata: userMetadata, StorageClass: b.storageClass, + SendContentMd5: b.sendChecksum, // 4 is what minio-go have as the default. To be certain we do micro benchmark before any changes we // ensure we pin this number to four. // TODO(bwplotka): Consider adjusting this number to GOMAXPROCS or to expose this in config if it becomes bottleneck.