From a688671da4a055efc8e9aade9c8df41445779179 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 2 Apr 2021 23:54:25 +0800 Subject: [PATCH] some optimizations for uploading to minio --- modules/io/reader.go | 30 ++++++++++++++++++++++++++++ modules/lfs/content_store.go | 9 +++++++++ modules/migrations/gitea_uploader.go | 3 ++- modules/storage/minio.go | 7 ++++++- 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 modules/io/reader.go diff --git a/modules/io/reader.go b/modules/io/reader.go new file mode 100644 index 0000000000000..1a0bb6f4c3cf2 --- /dev/null +++ b/modules/io/reader.go @@ -0,0 +1,30 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package io + +import "io" + +// ReadSizer represents a reader which have size information +type ReadSizer interface { + io.Reader + Size() int64 +} + +type readSizer struct { + io.Reader + size int64 +} + +func (r *readSizer) Size() int64 { + return r.size +} + +// WithSize binding io.Reader and size into a ReadSizer +func WithSize(rd io.Reader, size int64) ReadSizer { + return &readSizer{ + Reader: rd, + size: size, + } +} diff --git a/modules/lfs/content_store.go b/modules/lfs/content_store.go index 788ef5b9a6950..b7de19a3d5ab6 100644 --- a/modules/lfs/content_store.go +++ b/modules/lfs/content_store.go @@ -14,6 +14,7 @@ import ( "os" "code.gitea.io/gitea/models" + myio "code.gitea.io/gitea/modules/io" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/storage" ) @@ -125,6 +126,10 @@ type hashingReader struct { expectedHash string } +var ( + _ myio.ReadSizer = &hashingReader{} +) + func (r *hashingReader) Read(b []byte) (int, error) { n, err := r.internal.Read(b) @@ -150,6 +155,10 @@ func (r *hashingReader) Read(b []byte) (int, error) { return n, err } +func (r *hashingReader) Size() int64 { + return r.expectedSize +} + func newHashingReader(expectedSize int64, expectedHash string, reader io.Reader) *hashingReader { return &hashingReader{ internal: reader, diff --git a/modules/migrations/gitea_uploader.go b/modules/migrations/gitea_uploader.go index aa1ea4bc09d04..9f0b275f13f4d 100644 --- a/modules/migrations/gitea_uploader.go +++ b/modules/migrations/gitea_uploader.go @@ -17,6 +17,7 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/git" + myio "code.gitea.io/gitea/modules/io" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/migrations/base" "code.gitea.io/gitea/modules/repository" @@ -283,7 +284,7 @@ func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error { } } defer rc.Close() - _, err = storage.Attachments.Save(attach.RelativePath(), rc) + _, err = storage.Attachments.Save(attach.RelativePath(), myio.WithSize(rc, attach.Size)) return err }() if err != nil { diff --git a/modules/storage/minio.go b/modules/storage/minio.go index 0e0cb3690da64..40ac073e1e2ef 100644 --- a/modules/storage/minio.go +++ b/modules/storage/minio.go @@ -13,6 +13,7 @@ import ( "strings" "time" + myio "code.gitea.io/gitea/modules/io" "code.gitea.io/gitea/modules/log" "github.com/minio/minio-go/v7" @@ -132,12 +133,16 @@ func (m *MinioStorage) Open(path string) (Object, error) { // Save save a file to minio func (m *MinioStorage) Save(path string, r io.Reader) (int64, error) { + var size int64 = -1 + if sizer, ok := r.(myio.ReadSizer); ok { + size = sizer.Size() + } uploadInfo, err := m.client.PutObject( m.ctx, m.bucket, m.buildMinioPath(path), r, - -1, + size, minio.PutObjectOptions{ContentType: "application/octet-stream"}, ) if err != nil {