diff --git a/cmd/erasure-bucket.go b/cmd/erasure-bucket.go index ea218ffca..5f4e654d6 100644 --- a/cmd/erasure-bucket.go +++ b/cmd/erasure-bucket.go @@ -64,8 +64,7 @@ func (er erasureObjects) MakeBucketWithLocation(ctx context.Context, bucket stri }, index) } - writeQuorum := getWriteQuorum(len(storageDisks)) - err := reduceWriteQuorumErrs(ctx, g.Wait(), bucketOpIgnoredErrs, writeQuorum) + err := reduceWriteQuorumErrs(ctx, g.Wait(), bucketOpIgnoredErrs, er.defaultWQuorum()) return toObjectErr(err, bucket) } @@ -121,8 +120,7 @@ func (er erasureObjects) getBucketInfo(ctx context.Context, bucketName string) ( // reduce to one error based on read quorum. // `nil` is deliberately passed for ignoredErrs // because these errors were already ignored. - readQuorum := getReadQuorum(len(storageDisks)) - return BucketInfo{}, reduceReadQuorumErrs(ctx, errs, nil, readQuorum) + return BucketInfo{}, reduceReadQuorumErrs(ctx, errs, nil, er.defaultRQuorum()) } // GetBucketInfo - returns BucketInfo for a bucket. @@ -167,8 +165,7 @@ func (er erasureObjects) DeleteBucket(ctx context.Context, bucket string, opts D return nil } - writeQuorum := getWriteQuorum(len(storageDisks)) - err := reduceWriteQuorumErrs(ctx, dErrs, bucketOpIgnoredErrs, writeQuorum) + err := reduceWriteQuorumErrs(ctx, dErrs, bucketOpIgnoredErrs, er.defaultWQuorum()) if err == errErasureWriteQuorum && !opts.NoRecreate { undoDeleteBucket(storageDisks, bucket) } diff --git a/cmd/erasure-object.go b/cmd/erasure-object.go index b75721a0e..61cc5a623 100644 --- a/cmd/erasure-object.go +++ b/cmd/erasure-object.go @@ -498,7 +498,7 @@ func (er erasureObjects) getObjectInfo(ctx context.Context, bucket, object strin func (er erasureObjects) getObjectInfoAndQuorum(ctx context.Context, bucket, object string, opts ObjectOptions) (objInfo ObjectInfo, wquorum int, err error) { fi, _, _, err := er.getObjectFileInfo(ctx, bucket, object, opts, false) if err != nil { - return objInfo, getWriteQuorum(len(er.getDisks())), toObjectErr(err, bucket, object) + return objInfo, er.defaultWQuorum(), toObjectErr(err, bucket, object) } wquorum = fi.Erasure.DataBlocks @@ -1113,7 +1113,7 @@ func (er erasureObjects) DeleteObjects(ctx context.Context, bucket string, objec // class for objects which have reduced quorum // storage class only needs to be honored for // Read() requests alone which we already do. - writeQuorums[i] = getWriteQuorum(len(storageDisks)) + writeQuorums[i] = er.defaultWQuorum() } versionsMap := make(map[string]FileInfoVersions, len(objects)) @@ -1600,7 +1600,7 @@ func (er erasureObjects) updateObjectMeta(ctx context.Context, bucket, object st // Wait for all the routines. mErrs := g.Wait() - return reduceWriteQuorumErrs(ctx, mErrs, objectOpIgnoredErrs, getWriteQuorum(len(onlineDisks))) + return reduceWriteQuorumErrs(ctx, mErrs, objectOpIgnoredErrs, er.defaultWQuorum()) } // DeleteObjectTags - delete object tags from an existing object diff --git a/cmd/erasure.go b/cmd/erasure.go index 88b58d693..53aa06b0f 100644 --- a/cmd/erasure.go +++ b/cmd/erasure.go @@ -84,6 +84,19 @@ func (er erasureObjects) Shutdown(ctx context.Context) error { return nil } +// defaultWQuorum write quorum based on setDriveCount and defaultParityCount +func (er erasureObjects) defaultWQuorum() int { + dataCount := er.setDriveCount - er.defaultParityCount + if dataCount == er.defaultParityCount { + return dataCount + 1 + } + return dataCount +} + +func (er erasureObjects) defaultRQuorum() int { + return er.setDriveCount - er.defaultParityCount +} + // byDiskTotal is a collection satisfying sort.Interface. type byDiskTotal []madmin.Disk diff --git a/cmd/metacache-set.go b/cmd/metacache-set.go index 61f33f776..c87997b12 100644 --- a/cmd/metacache-set.go +++ b/cmd/metacache-set.go @@ -544,7 +544,7 @@ func (er *erasureObjects) listPath(ctx context.Context, o listPathOptions, resul // Special case: ask all disks if the drive count is 4 if askDisks == -1 || er.setDriveCount == 4 { askDisks = len(disks) // with 'strict' quorum list on all online disks. - listingQuorum = getReadQuorum(er.setDriveCount) + listingQuorum = er.defaultRQuorum() } if askDisks == 0 { askDisks = globalAPIConfig.getListQuorum()