Skip to content

Commit

Permalink
Allow turning off CRC32 checksums in S3 Puts
Browse files Browse the repository at this point in the history
thanos-io/thanos#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 `PutWithMD5` (open to naming changes) config entry
to the S3 bucket config that allows reverting back to MD5 checksums
which _are_ supported.

Signed-off-by: sinkingpoint <colin@quirl.co.nz>
  • Loading branch information
sinkingpoint committed Nov 10, 2023
1 parent ff7faac commit 5ce1435
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ We use *breaking :warning:* to mark changes that are not backward compatible (re
- [#73](https://github.com/thanos-io/objstore/pull/73) Аdded file path to erros from DownloadFile
- [#51](https://github.com/thanos-io/objstore/pull/51) Azure: Support using connection string authentication.
- [#76](https://github.com/thanos-io/objstore/pull/76) GCS: Query for object names only in `Iter` to possibly improve performance when listing objects.
- [#85](https://github.com/thanos-io/objstore/pull/85) S3: Allow checksum algorithm to be configured

### Changed
- [#38](https://github.com/thanos-io/objstore/pull/38) *: Upgrade minio-go version to `v7.0.45`.
Expand Down
5 changes: 5 additions & 0 deletions providers/s3/s3.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ var DefaultConfig = Config{
},
PartSize: 1024 * 1024 * 64, // 64MB.
BucketLookupType: AutoLookup,
SendContentMd5: true, // Default to using MD5.
}

// HTTPConfig exists here only because Cortex depends on it, and we depend on Cortex.
Expand All @@ -136,6 +137,7 @@ type Config struct {
TraceConfig TraceConfig `yaml:"trace"`
ListObjectsVersion string `yaml:"list_objects_version"`
BucketLookupType BucketLookupType `yaml:"bucket_lookup_type"`
SendContentMd5 bool `yaml:"send_content_md5"`
// 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"`
Expand Down Expand Up @@ -166,6 +168,7 @@ type Bucket struct {
storageClass string
partSize uint64
listObjectsV1 bool
sendContentMd5 bool
}

// parseConfig unmarshals a buffer into a Config with default values.
Expand Down Expand Up @@ -334,6 +337,7 @@ func NewBucketWithConfig(logger log.Logger, config Config, component string) (*B
storageClass: storageClass,
partSize: config.PartSize,
listObjectsV1: config.ListObjectsVersion == "v1",
sendContentMd5: config.SendContentMd5,
}
return bkt, nil
}
Expand Down Expand Up @@ -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.sendContentMd5,
// 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.
Expand Down

0 comments on commit 5ce1435

Please sign in to comment.