mirror of
https://github.com/minio/minio.git
synced 2025-07-08 08:32:18 -04:00
fix: diskInfo should check diskID only if disk is online (#10058)
closes #10057
This commit is contained in:
parent
07eb24b775
commit
7b14e9b660
@ -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…
x
Reference in New Issue
Block a user