nixos-config/packages/matrix/matrix-media-repo/0001-Make-using-MD5-hashing-a-config-option-on-the-datast.patch

86 lines
3.1 KiB
Diff

From b740c2f77c7e3b10ff77ebade90afa58f79f6267 Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Sat, 10 Jun 2023 15:04:48 -0600
Subject: [PATCH] Make using MD5 hashing a config option on the datastore
---
config.sample.yaml | 4 ++++
datastores/s3.go | 8 ++++++++
datastores/upload.go | 6 +++++-
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/config.sample.yaml b/config.sample.yaml
index d0d9543..24774b7 100644
--- a/config.sample.yaml
+++ b/config.sample.yaml
@@ -191,6 +191,10 @@ datastores:
# An optional storage class for tuning how the media is stored at s3.
# See https://aws.amazon.com/s3/storage-classes/ for details; uncomment to use.
#storageClass: STANDARD
+ # If you're seeing errors relating to 'z-amz-checksum-algorithm CRC32C not implemented',
+ # set this to `true`. This will reduce performance, but will allow uploads to be possible.
+ # It is common that you need to enable this with Backblaze B2 and CloudFlare R2.
+ useMD5: false
# Options for controlling archives. Archives are exports of a particular user's content for
# the purpose of GDPR or moving media to a different server.
diff --git a/datastores/s3.go b/datastores/s3.go
index 0517188..828f6e5 100644
--- a/datastores/s3.go
+++ b/datastores/s3.go
@@ -19,6 +19,7 @@ type s3 struct {
client *minio.Client
storageClass string
bucket string
+ putWithMd5 bool
}
func ResetS3Clients() {
@@ -37,6 +38,7 @@ func getS3(ds config.DatastoreConfig) (*s3, error) {
region := ds.Options["region"]
storageClass, hasStorageClass := ds.Options["storageClass"]
useSslStr, hasSsl := ds.Options["ssl"]
+ useMd5Str, hasMd5 := ds.Options["useMD5"]
if !hasStorageClass {
storageClass = "STANDARD"
@@ -47,6 +49,11 @@ func getS3(ds config.DatastoreConfig) (*s3, error) {
useSsl, _ = strconv.ParseBool(useSslStr)
}
+ useMd5 := false
+ if hasMd5 && useMd5Str != "" {
+ useMd5, _ = strconv.ParseBool(useMd5Str)
+ }
+
var err error
var client *minio.Client
client, err = minio.New(endpoint, &minio.Options{
@@ -62,6 +69,7 @@ func getS3(ds config.DatastoreConfig) (*s3, error) {
client: client,
storageClass: storageClass,
bucket: bucket,
+ putWithMd5: useMd5,
}
s3clients.Store(ds.Id, s3c)
return s3c, nil
diff --git a/datastores/upload.go b/datastores/upload.go
index a06bc0e..f011752 100644
--- a/datastores/upload.go
+++ b/datastores/upload.go
@@ -40,7 +40,11 @@ func Upload(ctx rcontext.RequestContext, ds config.DatastoreConfig, data io.Read
metrics.S3Operations.With(prometheus.Labels{"operation": "PutObject"}).Inc()
var info minio.UploadInfo
- info, err = s3c.client.PutObject(ctx.Context, s3c.bucket, objectName, tee, size, minio.PutObjectOptions{StorageClass: s3c.storageClass, ContentType: contentType})
+ info, err = s3c.client.PutObject(ctx.Context, s3c.bucket, objectName, tee, size, minio.PutObjectOptions{
+ StorageClass: s3c.storageClass,
+ ContentType: contentType,
+ SendContentMd5: s3c.putWithMd5,
+ })
uploadedBytes = info.Size
} else if ds.Type == "file" {
basePath := ds.Options["path"]
--
2.41.0