From f8fc14b2e0a10c64de0bd87f831ebde4f705b79b Mon Sep 17 00:00:00 2001 From: Marin Ivanov Date: Mon, 15 Aug 2022 06:16:55 +0300 Subject: Optimize for files larger than 16MiB --- fs.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'fs.go') diff --git a/fs.go b/fs.go index 4ccfd45..864570b 100644 --- a/fs.go +++ b/fs.go @@ -230,12 +230,28 @@ func (fs *Fs) newObjectWriter(key string) (io.WriteCloser, context.CancelFunc, < errc := make(chan error, 1) go func() { - b, err := io.ReadAll(r) + maxAtomicSize := int64(16 * (1 << 20)) + lr := io.LimitReader(r, maxAtomicSize) + b, err := io.ReadAll(lr) if err != nil { errc <- err return } - _, err = fs.client.PutObject(ctx, fs.bucket, key, bytes.NewReader(b), int64(len(b)), minio.PutObjectOptions{}) + if ctx.Err() != nil { + errc <- ctx.Err() + return + } + var rd io.Reader + var size int64 + if int64(len(b)) == maxAtomicSize { + rd = io.MultiReader(bytes.NewReader(b), r) + size = -1 + } else { + rd = bytes.NewReader(b) + size = int64(len(b)) + } + + _, err = fs.client.PutObject(ctx, fs.bucket, key, rd, size, minio.PutObjectOptions{}) errc <- fromErrorResponse(err) }() -- cgit v1.2.3