From d6dd98e597b672987e0c244d220f0345989d7807 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Fri, 23 Aug 2019 17:03:15 -0700 Subject: [PATCH] Avoid data-race in getDisksInfo call (#8126) --- cmd/xl-v1.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cmd/xl-v1.go b/cmd/xl-v1.go index 42fb376e1..b700650fd 100644 --- a/cmd/xl-v1.go +++ b/cmd/xl-v1.go @@ -71,11 +71,12 @@ 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)) + errs := make([]error, 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++ + errs[i] = errDiskNotFound continue } wg.Add(1) @@ -87,16 +88,23 @@ func getDisksInfo(disks []StorageAPI) (disksInfo []DiskInfo, onlineDisks int, of ctx := logger.SetReqInfo(context.Background(), reqInfo) logger.LogIf(ctx, err) if IsErr(err, baseErrs...) { - offlineDisks++ + errs[id] = err return } } - onlineDisks++ disksInfo[id] = info }(i, storageDisk) } // Wait for the routines. wg.Wait() + + for _, err := range errs { + if err != nil { + offlineDisks++ + } + onlineDisks++ + } + // Success. return disksInfo, onlineDisks, offlineDisks }