fix: diskInfo should check diskID only if disk is online (#10058)

closes #10057
master
Harshavardhana 4 years ago committed by GitHub
parent 07eb24b775
commit 7b14e9b660
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      cmd/background-newdisks-heal-ops.go
  2. 9
      cmd/erasure-sets.go
  3. 4
      cmd/xl-storage-disk-id-check.go

@ -20,10 +20,11 @@ import (
"context" "context"
"time" "time"
"github.com/dustin/go-humanize"
"github.com/minio/minio/cmd/logger" "github.com/minio/minio/cmd/logger"
) )
const defaultMonitorNewDiskInterval = time.Minute * 10 const defaultMonitorNewDiskInterval = time.Minute * 5
func initLocalDisksAutoHeal(ctx context.Context, objAPI ObjectLayer) { func initLocalDisksAutoHeal(ctx context.Context, objAPI ObjectLayer) {
go monitorLocalDisksAndHeal(ctx, objAPI) go monitorLocalDisksAndHeal(ctx, objAPI)
@ -83,6 +84,13 @@ func monitorLocalDisksAndHeal(ctx context.Context, objAPI ObjectLayer) {
continue continue
} }
logger.Info("New unformatted drives detected attempting to heal...")
for i, disks := range localDisksInZoneHeal {
for _, disk := range disks {
logger.Info("Healing disk '%s' on %s zone", disk, humanize.Ordinal(i+1))
}
}
// Reformat disks // Reformat disks
bgSeq.sourceCh <- healSource{bucket: SlashSeparator} bgSeq.sourceCh <- healSource{bucket: SlashSeparator}

@ -1256,8 +1256,9 @@ func (s *erasureSets) ReloadFormat(ctx context.Context, dryRun bool) (err error)
func isTestSetup(infos []DiskInfo, errs []error) bool { func isTestSetup(infos []DiskInfo, errs []error) bool {
rootDiskCount := 0 rootDiskCount := 0
for i := range errs { for i := range errs {
if errs[i] != nil { if errs[i] != nil && errs[i] != errUnformattedDisk {
// On error it is safer to assume that this is not a test setup. // On any error which is not unformatted disk
// it is safer to reject healing.
return false return false
} }
if infos[i].RootDisk { if infos[i].RootDisk {
@ -1268,7 +1269,7 @@ func isTestSetup(infos []DiskInfo, errs []error) bool {
return rootDiskCount == len(infos) return rootDiskCount == len(infos)
} }
func getAllDiskInfos(storageDisks []StorageAPI) ([]DiskInfo, []error) { func getHealDiskInfos(storageDisks []StorageAPI) ([]DiskInfo, []error) {
infos := make([]DiskInfo, len(storageDisks)) infos := make([]DiskInfo, len(storageDisks))
g := errgroup.WithNErrs(len(storageDisks)) g := errgroup.WithNErrs(len(storageDisks))
for index := range storageDisks { for index := range storageDisks {
@ -1289,7 +1290,7 @@ func getAllDiskInfos(storageDisks []StorageAPI) ([]DiskInfo, []error) {
// Mark root disks as down so as not to heal them. // Mark root disks as down so as not to heal them.
func markRootDisksAsDown(storageDisks []StorageAPI) { func markRootDisksAsDown(storageDisks []StorageAPI) {
infos, errs := getAllDiskInfos(storageDisks) infos, errs := getHealDiskInfos(storageDisks)
if isTestSetup(infos, errs) { if isTestSetup(infos, errs) {
// Allow healing of disks for test setups to help with testing. // Allow healing of disks for test setups to help with testing.
return return

@ -89,9 +89,13 @@ func (p *xlStorageDiskIDCheck) DiskInfo() (info DiskInfo, err error) {
if err != nil { if err != nil {
return info, err return info, err
} }
// check cached diskID against backend
// only if its non-empty.
if p.diskID != "" {
if p.diskID != info.ID { if p.diskID != info.ID {
return info, errDiskNotFound return info, errDiskNotFound
} }
}
return info, nil return info, nil
} }

Loading…
Cancel
Save