opt: Only stream big data usage caches (#16168)

This commit is contained in:
Klaus Post 2022-12-05 22:01:11 +01:00 committed by GitHub
parent a713aee3d5
commit 3fd9059b4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -18,6 +18,7 @@
package cmd
import (
"bytes"
"context"
"errors"
"fmt"
@ -879,13 +880,28 @@ func (d *dataUsageCache) load(ctx context.Context, store objectIO, name string)
// save the content of the cache to minioMetaBackgroundOpsBucket with the provided name.
func (d *dataUsageCache) save(ctx context.Context, store objectIO, name string) error {
var r io.Reader
// If big, do streaming...
size := int64(-1)
if len(d.Cache) > 10000 {
pr, pw := io.Pipe()
go func() {
pw.CloseWithError(d.serializeTo(pw))
}()
defer pr.Close()
r = pr
} else {
var buf bytes.Buffer
err := d.serializeTo(&buf)
if err != nil {
return err
}
r = &buf
size = int64(buf.Len())
}
r, err := hash.NewReader(pr, -1, "", "", -1)
hr, err := hash.NewReader(r, size, "", "", size)
if err != nil {
return err
}
@ -896,7 +912,7 @@ func (d *dataUsageCache) save(ctx context.Context, store objectIO, name string)
_, err = store.PutObject(ctx,
dataUsageBucket,
name,
NewPutObjReader(r),
NewPutObjReader(hr),
ObjectOptions{})
if isErrBucketNotFound(err) {
return nil