diff --git a/cmd/bucket-quota.go b/cmd/bucket-quota.go index 30ed713cd..1b7d6e6db 100644 --- a/cmd/bucket-quota.go +++ b/cmd/bucket-quota.go @@ -68,43 +68,36 @@ func (sys *BucketQuotaSys) check(ctx context.Context, bucket string, size int64) return errServerNotInitialized } - q, err := sys.Get(bucket) - if err != nil { - return nil - } - - if q.Type == madmin.FIFOQuota { - return nil - } - - if q.Quota == 0 { - // No quota set return quickly. - return nil - } - sys.bucketStorageCache.Once.Do(func() { - sys.bucketStorageCache.TTL = 10 * time.Second + sys.bucketStorageCache.TTL = 1 * time.Second sys.bucketStorageCache.Update = func() (interface{}, error) { return loadDataUsageFromBackend(ctx, objAPI) } }) - v, err := sys.bucketStorageCache.Get() + q, err := sys.Get(bucket) if err != nil { return err } - dui := v.(DataUsageInfo) + if q != nil && q.Type == madmin.HardQuota && q.Quota > 0 { + v, err := sys.bucketStorageCache.Get() + if err != nil { + return err + } - bui, ok := dui.BucketsUsage[bucket] - if !ok { - // bucket not found, cannot enforce quota - // call will fail anyways later. - return nil - } + dui := v.(DataUsageInfo) + + bui, ok := dui.BucketsUsage[bucket] + if !ok { + // bucket not found, cannot enforce quota + // call will fail anyways later. + return nil + } - if (bui.Size + uint64(size)) > q.Quota { - return BucketQuotaExceeded{Bucket: bucket} + if (bui.Size + uint64(size)) >= q.Quota { + return BucketQuotaExceeded{Bucket: bucket} + } } return nil diff --git a/cmd/object-handlers.go b/cmd/object-handlers.go index c416d656a..f398d9029 100644 --- a/cmd/object-handlers.go +++ b/cmd/object-handlers.go @@ -980,6 +980,7 @@ func (api objectAPIHandlers) CopyObjectHandler(w http.ResponseWriter, r *http.Re } length = actualSize } + if !cpSrcDstSame { if err := enforceBucketQuota(ctx, dstBucket, actualSize); err != nil { writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) @@ -1893,10 +1894,12 @@ func (api objectAPIHandlers) CopyObjectPartHandler(w http.ResponseWriter, r *htt return } } + if err := enforceBucketQuota(ctx, dstBucket, actualPartSize); err != nil { writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) return } + // Special care for CopyObjectPart if partRangeErr := checkCopyPartRangeWithSize(rs, actualPartSize); partRangeErr != nil { writeCopyPartErr(ctx, w, partRangeErr, r.URL, guessIsBrowserReq(r))