Tweak listing quorum (#14703)

Always go for 50% quorum, and only use non-healing disks.

Fixes #14635
This commit is contained in:
Klaus Post
2022-04-06 12:24:21 -07:00
committed by GitHub
parent 255116fde7
commit 901d33b59c
2 changed files with 137 additions and 6 deletions

View File

@@ -549,7 +549,7 @@ func getListQuorum(quorum string, driveCount int) int {
case "reduced":
return 2
case "strict":
return -1
return driveCount
}
// Defaults to (driveCount+1)/2 drives per set, defaults to "optimal" value
if driveCount > 0 {
@@ -563,16 +563,19 @@ func (er *erasureObjects) listPath(ctx context.Context, o listPathOptions, resul
defer close(results)
o.debugf(color.Green("listPath:")+" with options: %#v", o)
// get non-healing disks for listing
disks, _ := er.getOnlineDisksWithHealing()
askDisks := getListQuorum(o.AskDisks, er.setDriveCount)
listingQuorum := askDisks - 1
disks := er.getDisks()
var fallbackDisks []StorageAPI
// Special case: ask all disks if the drive count is 4
if askDisks <= 0 || er.setDriveCount == 4 {
askDisks = len(disks) // with 'strict' quorum list on all drives.
listingQuorum = (len(disks) + 1) / 2 // keep this such that we can list all objects with different quorum ratio.
if er.setDriveCount == 4 || askDisks > len(disks) {
askDisks = len(disks) // use all available drives
}
// However many we ask, versions must exist on ~50%
listingQuorum := (askDisks + 1) / 2
if askDisks > 0 && len(disks) > askDisks {
rand.Shuffle(len(disks), func(i, j int) {
disks[i], disks[j] = disks[j], disks[i]