From b923a6242589ceb03eb35c9510b7ff560ff71735 Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Mon, 30 Jan 2023 14:03:07 +0100 Subject: [PATCH] Check pool-index for invalid setups (#16501) --- cmd/erasure-server-pool-rebalance.go | 5 +++++ cmd/notification-summary.go | 10 ++++++++++ cmd/rebalance-admin.go | 5 +++++ 3 files changed, 20 insertions(+) diff --git a/cmd/erasure-server-pool-rebalance.go b/cmd/erasure-server-pool-rebalance.go index c23c10d83..059c5b99a 100644 --- a/cmd/erasure-server-pool-rebalance.go +++ b/cmd/erasure-server-pool-rebalance.go @@ -133,6 +133,11 @@ func (z *erasureServerPools) initRebalanceMeta(ctx context.Context, buckets []st }, len(z.serverPools)) var totalCap, totalFree uint64 for _, disk := range si.Disks { + // Ignore invalid. + if disk.PoolIndex < 0 || len(diskStats) <= disk.PoolIndex { + // https://github.com/minio/minio/issues/16500 + continue + } totalCap += disk.TotalSpace totalFree += disk.AvailableSpace diff --git a/cmd/notification-summary.go b/cmd/notification-summary.go index ff3933a20..53725f5a0 100644 --- a/cmd/notification-summary.go +++ b/cmd/notification-summary.go @@ -32,6 +32,11 @@ func GetTotalCapacity(diskInfo []madmin.Disk) (capacity uint64) { // GetTotalUsableCapacity gets the total usable capacity in the cluster. func GetTotalUsableCapacity(diskInfo []madmin.Disk, s StorageInfo) (capacity uint64) { for _, disk := range diskInfo { + // Ignore invalid. + if disk.PoolIndex < 0 || len(s.Backend.StandardSCData) <= disk.PoolIndex { + // https://github.com/minio/minio/issues/16500 + continue + } // Ignore parity disks if disk.DiskIndex < s.Backend.StandardSCData[disk.PoolIndex] { capacity += disk.TotalSpace @@ -51,6 +56,11 @@ func GetTotalCapacityFree(diskInfo []madmin.Disk) (capacity uint64) { // GetTotalUsableCapacityFree gets the total usable capacity free in the cluster. func GetTotalUsableCapacityFree(diskInfo []madmin.Disk, s StorageInfo) (capacity uint64) { for _, disk := range diskInfo { + // Ignore invalid. + if disk.PoolIndex < 0 || len(s.Backend.StandardSCData) <= disk.PoolIndex { + // https://github.com/minio/minio/issues/16500 + continue + } // Ignore parity disks if disk.DiskIndex < s.Backend.StandardSCData[disk.PoolIndex] { capacity += disk.AvailableSpace diff --git a/cmd/rebalance-admin.go b/cmd/rebalance-admin.go index d1f2317c5..ff92e8cbe 100644 --- a/cmd/rebalance-admin.go +++ b/cmd/rebalance-admin.go @@ -61,6 +61,11 @@ func rebalanceStatus(ctx context.Context, z *erasureServerPools) (r rebalanceAdm TotalSpace uint64 }, len(z.serverPools)) for _, disk := range si.Disks { + // Ignore invalid. + if disk.PoolIndex < 0 || len(diskStats) <= disk.PoolIndex { + // https://github.com/minio/minio/issues/16500 + continue + } diskStats[disk.PoolIndex].AvailableSpace += disk.AvailableSpace diskStats[disk.PoolIndex].TotalSpace += disk.TotalSpace }