From 6683247080209c0d658f30b7aeae76a2b9d55114 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Wed, 12 Apr 2017 15:38:35 -0700 Subject: [PATCH] tests: Fix the sopradic test failure in TestListObjectPartsDiskNotFound (#4107) getBucketInfo() should keep track errors ignored, such that in a situation where all errors were ignored we need to reduce the errors using readQuorum to get a consistent error value. This is the problem we see with DiskNotFound test disks are randomly removed. Fixes #4095 --- cmd/object-api-multipart_test.go | 2 +- cmd/xl-v1-bucket.go | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/cmd/object-api-multipart_test.go b/cmd/object-api-multipart_test.go index 5feee0363..947ee6bb6 100644 --- a/cmd/object-api-multipart_test.go +++ b/cmd/object-api-multipart_test.go @@ -1457,7 +1457,7 @@ func testListObjectPartsDiskNotFound(obj ObjectLayer, instanceType string, disks // Failed as expected, but does it fail for the expected reason. if actualErr != nil && !testCase.shouldPass { if !strings.Contains(actualErr.Error(), testCase.expectedErr.Error()) { - t.Errorf("Test %d: %s: Expected to fail with error \"%s\", but instead failed with error \"%s\" instead", i+1, instanceType, testCase.expectedErr.Error(), actualErr.Error()) + t.Errorf("Test %d: %s: Expected to fail with error \"%s\", but instead failed with error \"%s\" instead", i+1, instanceType, testCase.expectedErr, actualErr) } } // Passes as expected, but asserting the results. diff --git a/cmd/xl-v1-bucket.go b/cmd/xl-v1-bucket.go index f2b9a5af7..af1eaca30 100644 --- a/cmd/xl-v1-bucket.go +++ b/cmd/xl-v1-bucket.go @@ -113,27 +113,34 @@ func undoMakeBucket(storageDisks []StorageAPI, bucket string) { // getBucketInfo - returns the BucketInfo from one of the load balanced disks. func (xl xlObjects) getBucketInfo(bucketName string) (bucketInfo BucketInfo, err error) { + var bucketErrs []error for _, disk := range xl.getLoadBalancedDisks() { if disk == nil { + bucketErrs = append(bucketErrs, errDiskNotFound) continue } - var volInfo VolInfo - volInfo, err = disk.StatVol(bucketName) - if err == nil { + volInfo, serr := disk.StatVol(bucketName) + if serr == nil { bucketInfo = BucketInfo{ Name: volInfo.Name, Created: volInfo.Created, } return bucketInfo, nil } - err = traceError(err) + err = traceError(serr) // For any reason disk went offline continue and pick the next one. if isErrIgnored(err, bucketMetadataOpIgnoredErrs...) { + bucketErrs = append(bucketErrs, err) continue } - break + // Any error which cannot be ignored, we return quickly. + return BucketInfo{}, err } - return BucketInfo{}, err + // If all our errors were ignored, then we try to + // reduce to one error based on read quorum. + // `nil` is deliberately passed for ignoredErrs + // because these errors were already ignored. + return BucketInfo{}, reduceReadQuorumErrs(bucketErrs, nil, xl.readQuorum) } // GetBucketInfo - returns BucketInfo for a bucket. @@ -180,6 +187,7 @@ func (xl xlObjects) listBuckets() (bucketsInfo []BucketInfo, err error) { } return bucketsInfo, nil } + err = traceError(err) // Ignore any disks not found. if isErrIgnored(err, bucketMetadataOpIgnoredErrs...) { continue