diff --git a/xl-erasure-v1.go b/xl-erasure-v1.go index 8dcbbd083..aecebfa78 100644 --- a/xl-erasure-v1.go +++ b/xl-erasure-v1.go @@ -195,13 +195,26 @@ func (xl XL) ListVols() (volsInfo []VolInfo, err error) { // Verify if we have enough quorum to list vols. return nil, errReadQuorum } - // Loop through success vols map and return the first value. + + var total, free int64 + // Loop through success vols map and get aggregated usage values. for index := range xl.storageDisks { if _, ok := successVolsMap[index]; ok { volsInfo = successVolsMap[index] - break + free += volsInfo[0].Free + total += volsInfo[0].Total } } + // Save the updated usage values back into the vols. + for index := range volsInfo { + volsInfo[index].Free = free + volsInfo[index].Total = total + } + + // TODO: the assumption here is that volumes across all disks in + // readQuorum have consistent view i.e they all have same number + // of buckets. This is essentially not verified since healing + // should take care of this. return volsInfo, nil } @@ -239,8 +252,16 @@ func (xl XL) StatVol(volume string) (volInfo VolInfo, err error) { return VolInfo{}, errReadQuorum } - // If successful remove all the duplicates and keep the latest one. + // Loop through all statVols, calculate the actual usage values. + var total, free int64 + for _, statVolInfo := range statVols { + free += statVolInfo.Free + total += statVolInfo.Total + } + // Filter statVols and update the volInfo. volInfo = removeDuplicateVols(statVols)[0] + volInfo.Free = free + volInfo.Total = total return volInfo, nil }