diff --git a/xl-v1.go b/xl-v1.go index d024b0d8c..3285c4c75 100644 --- a/xl-v1.go +++ b/xl-v1.go @@ -406,8 +406,54 @@ func (xl XL) ListFiles(volume, prefix, marker string, recursive bool, count int) if !isValidVolname(volume) { return nil, true, errInvalidArgument } - // Pick the first disk and list there always. - disk := xl.storageDisks[0] + + // TODO: Fix: If readQuorum is met, its assumed that disks are in consistent file list. + // exclude disks those are not in consistent file list and check count of remaining disks + // are met readQuorum. + + // Treat empty file list specially + emptyCount := 0 + errCount := 0 + successCount := 0 + + var firstFilesInfo []FileInfo + var firstEOF bool + var firstErr error + + for _, disk := range xl.storageDisks { + if filesInfo, eof, err = xl.listFiles(disk, volume, prefix, marker, recursive, count); err == nil { + // we need to return first successful result + if firstFilesInfo == nil { + firstFilesInfo = filesInfo + firstEOF = eof + } + + if len(filesInfo) == 0 { + emptyCount++ + } else { + successCount++ + } + } else { + if firstErr == nil { + firstErr = err + } + + errCount++ + } + } + + if errCount >= xl.readQuorum { + return nil, false, firstErr + } else if successCount >= xl.readQuorum { + return firstFilesInfo, firstEOF, nil + } else if emptyCount >= xl.readQuorum { + return []FileInfo{}, true, nil + } + + return nil, false, errReadQuorum +} + +func (xl XL) listFiles(disk StorageAPI, volume, prefix, marker string, recursive bool, count int) (filesInfo []FileInfo, eof bool, err error) { var fsFilesInfo []FileInfo var markerPath = marker if marker != "" {