From e211f6f52e0203cf3353df4fcaea6f5e7c1ef2e5 Mon Sep 17 00:00:00 2001 From: Praveen raj Mani Date: Fri, 23 Aug 2019 08:32:40 +0530 Subject: [PATCH] Parallelize the DiskInfo calls in xl.StorageInfo() (#8115) --- cmd/xl-sets.go | 26 +++++++++++++++++++------- cmd/xl-v1.go | 31 +++++++++++++++++++------------ 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/cmd/xl-sets.go b/cmd/xl-sets.go index 32f04d93f..8fb04d05d 100644 --- a/cmd/xl-sets.go +++ b/cmd/xl-sets.go @@ -304,14 +304,26 @@ func newXLSets(endpoints EndpointList, format *formatXLV3, setCount int, drivesP // StorageInfo - combines output of StorageInfo across all erasure coded object sets. func (s *xlSets) StorageInfo(ctx context.Context) StorageInfo { var storageInfo StorageInfo + var wg sync.WaitGroup + + storageInfos := make([]StorageInfo, len(s.sets)) storageInfo.Backend.Type = BackendErasure - for _, set := range s.sets { - lstorageInfo := set.StorageInfo(ctx) - storageInfo.Used = storageInfo.Used + lstorageInfo.Used - storageInfo.Total = storageInfo.Total + lstorageInfo.Total - storageInfo.Available = storageInfo.Available + lstorageInfo.Available - storageInfo.Backend.OnlineDisks = storageInfo.Backend.OnlineDisks + lstorageInfo.Backend.OnlineDisks - storageInfo.Backend.OfflineDisks = storageInfo.Backend.OfflineDisks + lstorageInfo.Backend.OfflineDisks + for index, set := range s.sets { + wg.Add(1) + go func(id int, set *xlObjects) { + defer wg.Done() + storageInfos[id] = set.StorageInfo(ctx) + }(index, set) + } + // Wait for the go routines. + wg.Wait() + + for _, lstorageInfo := range storageInfos { + storageInfo.Used += lstorageInfo.Used + storageInfo.Total += lstorageInfo.Total + storageInfo.Available += lstorageInfo.Available + storageInfo.Backend.OnlineDisks += lstorageInfo.Backend.OnlineDisks + storageInfo.Backend.OfflineDisks += lstorageInfo.Backend.OfflineDisks } scData, scParity := getRedundancyCount(standardStorageClass, s.drivesPerSet) diff --git a/cmd/xl-v1.go b/cmd/xl-v1.go index 712936a1b..42fb376e1 100644 --- a/cmd/xl-v1.go +++ b/cmd/xl-v1.go @@ -19,6 +19,7 @@ package cmd import ( "context" "sort" + "sync" "github.com/minio/minio/cmd/logger" "github.com/minio/minio/pkg/bpool" @@ -70,26 +71,32 @@ func (d byDiskTotal) Less(i, j int) bool { // getDisksInfo - fetch disks info across all other storage API. func getDisksInfo(disks []StorageAPI) (disksInfo []DiskInfo, onlineDisks int, offlineDisks int) { disksInfo = make([]DiskInfo, len(disks)) + var wg sync.WaitGroup for i, storageDisk := range disks { if storageDisk == nil { // Storage disk is empty, perhaps ignored disk or not available. offlineDisks++ continue } - info, err := storageDisk.DiskInfo() - if err != nil { - ctx := context.Background() - logger.GetReqInfo(ctx).AppendTags("disk", storageDisk.String()) - logger.LogIf(ctx, err) - if IsErr(err, baseErrs...) { - offlineDisks++ - continue + wg.Add(1) + go func(id int, sDisk StorageAPI) { + defer wg.Done() + info, err := sDisk.DiskInfo() + if err != nil { + reqInfo := (&logger.ReqInfo{}).AppendTags("disk", sDisk.String()) + ctx := logger.SetReqInfo(context.Background(), reqInfo) + logger.LogIf(ctx, err) + if IsErr(err, baseErrs...) { + offlineDisks++ + return + } } - } - onlineDisks++ - disksInfo[i] = info + onlineDisks++ + disksInfo[id] = info + }(i, storageDisk) } - + // Wait for the routines. + wg.Wait() // Success. return disksInfo, onlineDisks, offlineDisks }