From 07a7f329e70d5f05d8aa29afae60cdf0de002ad7 Mon Sep 17 00:00:00 2001 From: kannappanr <30541348+kannappanr@users.noreply.github.com> Date: Wed, 4 Mar 2020 16:18:32 -0800 Subject: [PATCH] xl: Fix counting offline disks in StorageInfo (#9082) Recent modification in the code led to incorrect calculation of offline disks. This commit saves the endpoint list in a xlObjects then we know the name of each disk. --- cmd/xl-sets.go | 6 ++++++ cmd/xl-v1.go | 28 ++++++++++++---------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/cmd/xl-sets.go b/cmd/xl-sets.go index 6808ab353..a7e2da157 100644 --- a/cmd/xl-sets.go +++ b/cmd/xl-sets.go @@ -302,10 +302,16 @@ func newXLSets(endpoints Endpoints, format *formatXLV3, setCount int, drivesPerS s.xlDisks[i] = make([]StorageAPI, drivesPerSet) s.xlLockers[i] = make([]dsync.NetLocker, drivesPerSet) + var endpoints Endpoints + for j := 0; j < drivesPerSet; j++ { + endpoints = append(endpoints, s.endpoints[i*s.drivesPerSet+j]) + } + // Initialize xl objects for a given set. s.sets[i] = &xlObjects{ getDisks: s.GetDisks(i), getLockers: s.GetLockers(i), + endpoints: endpoints, nsMutex: mutex, bp: bp, mrfUploadCh: make(chan partialUpload, 10000), diff --git a/cmd/xl-v1.go b/cmd/xl-v1.go index cc344f896..cb924d06e 100644 --- a/cmd/xl-v1.go +++ b/cmd/xl-v1.go @@ -53,6 +53,8 @@ type xlObjects struct { // getLockers returns list of remote and local lockers. getLockers func() []dsync.NetLocker + endpoints Endpoints + // Locker mutex map. nsMutex *nsLockMap @@ -87,7 +89,7 @@ func (d byDiskTotal) Less(i, j int) bool { } // getDisksInfo - fetch disks info across all other storage API. -func getDisksInfo(disks []StorageAPI) (disksInfo []DiskInfo, onlineDisks, offlineDisks madmin.BackendDisks) { +func getDisksInfo(disks []StorageAPI, endpoints Endpoints) (disksInfo []DiskInfo, onlineDisks, offlineDisks madmin.BackendDisks) { disksInfo = make([]DiskInfo, len(disks)) g := errgroup.WithNErrs(len(disks)) @@ -115,24 +117,16 @@ func getDisksInfo(disks []StorageAPI) (disksInfo []DiskInfo, onlineDisks, offlin onlineDisks = make(madmin.BackendDisks) offlineDisks = make(madmin.BackendDisks) - localNodeAddr := GetLocalPeer(globalEndpoints) - // Wait for the routines. for i, diskInfoErr := range g.Wait() { - if disks[i] == nil { - continue - } - peerAddr := disks[i].Hostname() - if peerAddr == "" { - peerAddr = localNodeAddr - } + peerAddr := endpoints[i].Host if _, ok := offlineDisks[peerAddr]; !ok { offlineDisks[peerAddr] = 0 } if _, ok := onlineDisks[peerAddr]; !ok { onlineDisks[peerAddr] = 0 } - if diskInfoErr != nil { + if disks[i] == nil || diskInfoErr != nil { offlineDisks[peerAddr]++ continue } @@ -144,8 +138,8 @@ func getDisksInfo(disks []StorageAPI) (disksInfo []DiskInfo, onlineDisks, offlin } // Get an aggregated storage info across all disks. -func getStorageInfo(disks []StorageAPI) StorageInfo { - disksInfo, onlineDisks, offlineDisks := getDisksInfo(disks) +func getStorageInfo(disks []StorageAPI, endpoints Endpoints) StorageInfo { + disksInfo, onlineDisks, offlineDisks := getDisksInfo(disks, endpoints) // Sort so that the first element is the smallest. sort.Sort(byDiskTotal(disksInfo)) @@ -179,18 +173,20 @@ func getStorageInfo(disks []StorageAPI) StorageInfo { // StorageInfo - returns underlying storage statistics. func (xl xlObjects) StorageInfo(ctx context.Context, local bool) StorageInfo { + var endpoints = xl.endpoints var disks []StorageAPI + if !local { disks = xl.getDisks() } else { - for _, d := range xl.getDisks() { - if d != nil && d.Hostname() == "" { + for i, d := range xl.getDisks() { + if endpoints[i].IsLocal { // Append this local disk since local flag is true disks = append(disks, d) } } } - return getStorageInfo(disks) + return getStorageInfo(disks, endpoints) } // GetMetrics - is not implemented and shouldn't be called.