Heal bucket only on missing drives in quorum (#8883)

MakeVol shouldn't be called in heal bucket
when bucket doesn't really exist in quorum.
This commit is contained in:
Harshavardhana 2020-01-24 15:38:07 -08:00 committed by kannappanr
parent 1ffbb5c24c
commit cf37c7997e

View File

@ -92,11 +92,7 @@ func healBucket(ctx context.Context, storageDisks []StorageAPI, bucket string, w
return nil return nil
} }
makeErr := storageDisks[index].MakeVol(bucket) return serr
if makeErr == nil {
afterState[index] = madmin.DriveStateOk
}
return makeErr
} }
beforeState[index] = madmin.DriveStateOk beforeState[index] = madmin.DriveStateOk
afterState[index] = madmin.DriveStateOk afterState[index] = madmin.DriveStateOk
@ -106,12 +102,18 @@ func healBucket(ctx context.Context, storageDisks []StorageAPI, bucket string, w
errs := g.Wait() errs := g.Wait()
reducedErr := reduceWriteQuorumErrs(ctx, errs, bucketOpIgnoredErrs, writeQuorum-1)
if reducedErr == errVolumeNotFound {
return res, nil
}
// Initialize heal result info // Initialize heal result info
res = madmin.HealResultItem{ res = madmin.HealResultItem{
Type: madmin.HealItemBucket, Type: madmin.HealItemBucket,
Bucket: bucket, Bucket: bucket,
DiskCount: len(storageDisks), DiskCount: len(storageDisks),
} }
for i := range beforeState { for i := range beforeState {
if storageDisks[i] != nil { if storageDisks[i] != nil {
drive := storageDisks[i].String() drive := storageDisks[i].String()
@ -128,11 +130,32 @@ func healBucket(ctx context.Context, storageDisks []StorageAPI, bucket string, w
} }
} }
reducedErr := reduceWriteQuorumErrs(ctx, errs, bucketOpIgnoredErrs, writeQuorum) // Initialize sync waitgroup.
g = errgroup.WithNErrs(len(storageDisks))
// Make a volume entry on all underlying storage disks.
for index := range storageDisks {
index := index
g.Go(func() error {
if beforeState[index] == madmin.DriveStateMissing {
makeErr := storageDisks[index].MakeVol(bucket)
if makeErr == nil {
afterState[index] = madmin.DriveStateOk
}
return makeErr
}
return errs[index]
}, index)
}
errs = g.Wait()
reducedErr = reduceWriteQuorumErrs(ctx, errs, bucketOpIgnoredErrs, writeQuorum)
if reducedErr == errXLWriteQuorum { if reducedErr == errXLWriteQuorum {
// Purge successfully created buckets if we don't have writeQuorum. // Purge successfully created buckets if we don't have writeQuorum.
undoMakeBucket(storageDisks, bucket) undoMakeBucket(storageDisks, bucket)
} }
return res, reducedErr return res, reducedErr
} }