XL/GetObject: pick the xl.json with highest version for metadata information. (#1914)

fixes #1913
This commit is contained in:
Krishna Srinivas 2016-06-17 10:56:18 +05:30 committed by Harshavardhana
parent 365f80efa3
commit d31b38aac8

View File

@ -54,25 +54,23 @@ func (xl xlObjects) GetObject(bucket, object string, startOffset int64, length i
defer nsMutex.RUnlock(bucket, object) defer nsMutex.RUnlock(bucket, object)
// Read metadata associated with the object from all disks. // Read metadata associated with the object from all disks.
partsMetadata, errs := xl.readAllXLMetadata(bucket, object) metaArr, errs := xl.readAllXLMetadata(bucket, object)
if err := reduceError(errs, xl.readQuorum); err != nil { if err := reduceError(errs, xl.readQuorum); err != nil {
return toObjectErr(err, bucket, object) return toObjectErr(err, bucket, object)
} }
// List all online disks. // List all online disks.
onlineDisks, _, err := xl.listOnlineDisks(partsMetadata, errs) onlineDisks, highestVersion, err := xl.listOnlineDisks(metaArr, errs)
if err != nil { if err != nil {
return toObjectErr(err, bucket, object) return toObjectErr(err, bucket, object)
} }
// Pick one from the first valid metadata. // Pick latest valid metadata.
xlMeta := partsMetadata[0] var xlMeta xlMetaV1
if !xlMeta.IsValid() { for _, meta := range metaArr {
for _, partMetadata := range partsMetadata { if meta.IsValid() && meta.Stat.Version == highestVersion {
if partMetadata.IsValid() { xlMeta = meta
xlMeta = partMetadata break
break
}
} }
} }
@ -85,7 +83,7 @@ func (xl xlObjects) GetObject(bucket, object string, startOffset int64, length i
// Collect all the previous erasure infos across the disk. // Collect all the previous erasure infos across the disk.
var eInfos []erasureInfo var eInfos []erasureInfo
for index := range onlineDisks { for index := range onlineDisks {
eInfos = append(eInfos, partsMetadata[index].Erasure) eInfos = append(eInfos, metaArr[index].Erasure)
} }
// Read from all parts. // Read from all parts.