mirror of
https://github.com/minio/minio.git
synced 2025-02-03 01:46:00 -05:00
Return listing when exceeding min disk errors (#19644)
When listing, with drives returning `errFileNotFound,` `errVolumeNotFound`, or `errUnformattedDisk,`, we could get below `minDisks` drives being left. This would result in a quorum never being reachable for any object. Therefore, the listing would continue, but no results would ever be produced. Include `fnf` in the mindisk check since it is incremented on these errors. This will stop listing when minDisks are left. Allow `opts.minDisks` to not return errVolumeNotFound or errFileNotFound and return that. That will allow for good results even if disks return something else. We switch `errUnformattedDisk` to a regular error. If we have enough of those, we should just fail.
This commit is contained in:
parent
8c1bba681b
commit
0cde17ae5d
@ -1010,8 +1010,7 @@ func listPathRaw(ctx context.Context, opts listPathRawOptions) (err error) {
|
||||
// not a storage error.
|
||||
return nil
|
||||
}
|
||||
askDisks := len(disks)
|
||||
readers := make([]*metacacheReader, askDisks)
|
||||
readers := make([]*metacacheReader, len(disks))
|
||||
defer func() {
|
||||
for _, r := range readers {
|
||||
r.Close()
|
||||
@ -1093,16 +1092,14 @@ func listPathRaw(ctx context.Context, opts listPathRawOptions) (err error) {
|
||||
case nil:
|
||||
default:
|
||||
switch err.Error() {
|
||||
case errFileNotFound.Error(),
|
||||
errVolumeNotFound.Error(),
|
||||
errUnformattedDisk.Error():
|
||||
case errFileNotFound.Error():
|
||||
atEOF++
|
||||
fnf++
|
||||
// This is a special case, to handle bucket does
|
||||
// not exist situations.
|
||||
if errors.Is(err, errVolumeNotFound) {
|
||||
vnf++
|
||||
}
|
||||
continue
|
||||
case errVolumeNotFound.Error():
|
||||
atEOF++
|
||||
fnf++
|
||||
vnf++
|
||||
continue
|
||||
}
|
||||
hasErr++
|
||||
@ -1141,8 +1138,17 @@ func listPathRaw(ctx context.Context, opts listPathRawOptions) (err error) {
|
||||
topEntries[i] = entry
|
||||
}
|
||||
|
||||
// Stop if we exceed number of bad disks
|
||||
if hasErr > len(disks)-opts.minDisks && hasErr > 0 {
|
||||
// Since minDisks is set to quorum, we return if we have enough.
|
||||
if vnf > 0 && vnf >= len(readers)-opts.minDisks {
|
||||
return errVolumeNotFound
|
||||
}
|
||||
// Since minDisks is set to quorum, we return if we have enough.
|
||||
if fnf > 0 && fnf >= len(readers)-opts.minDisks {
|
||||
return errFileNotFound
|
||||
}
|
||||
|
||||
// Stop if we exceed number of bad disks.
|
||||
if hasErr > 0 && hasErr+fnf > len(disks)-opts.minDisks {
|
||||
if opts.finished != nil {
|
||||
opts.finished(errs)
|
||||
}
|
||||
@ -1160,10 +1166,6 @@ func listPathRaw(ctx context.Context, opts listPathRawOptions) (err error) {
|
||||
return errors.New(strings.Join(combinedErr, ", "))
|
||||
}
|
||||
|
||||
if vnf == len(readers) {
|
||||
return errVolumeNotFound
|
||||
}
|
||||
|
||||
// Break if all at EOF or error.
|
||||
if atEOF+hasErr == len(readers) {
|
||||
if hasErr > 0 && opts.finished != nil {
|
||||
@ -1172,10 +1174,6 @@ func listPathRaw(ctx context.Context, opts listPathRawOptions) (err error) {
|
||||
break
|
||||
}
|
||||
|
||||
if fnf == len(readers) {
|
||||
return errFileNotFound
|
||||
}
|
||||
|
||||
if agree == len(readers) {
|
||||
// Everybody agreed
|
||||
for _, r := range readers {
|
||||
|
Loading…
x
Reference in New Issue
Block a user