Clean up ToFileInfo and avoid copy (#13144)

Simplify code and remove an iteration of all versions. Remove unneded copy.
This commit is contained in:
Klaus Post 2021-09-03 21:31:32 +02:00 committed by GitHub
parent 88e6c11746
commit 308371b434
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -237,6 +237,19 @@ func (j xlMetaV2Version) Valid() bool {
return false return false
} }
// getModTime will return the ModTime of the underlying version.
func (j xlMetaV2Version) getModTime() time.Time {
switch j.Type {
case ObjectType:
return time.Unix(0, j.ObjectV2.ModTime)
case DeleteType:
return time.Unix(0, j.DeleteMarker.ModTime)
case LegacyType:
return j.ObjectV1.Stat.ModTime
}
return time.Time{}
}
// xlMetaV2 - object meta structure defines the format and list of // xlMetaV2 - object meta structure defines the format and list of
// the journals for the object. // the journals for the object.
type xlMetaV2 struct { type xlMetaV2 struct {
@ -1314,18 +1327,6 @@ func (z xlMetaV2) ListVersions(volume, path string) ([]FileInfo, time.Time, erro
return versions, versions[0].ModTime, nil return versions, versions[0].ModTime, nil
} }
func getModTimeFromVersion(v xlMetaV2Version) time.Time {
switch v.Type {
case ObjectType:
return time.Unix(0, v.ObjectV2.ModTime)
case DeleteType:
return time.Unix(0, v.DeleteMarker.ModTime)
case LegacyType:
return v.ObjectV1.Stat.ModTime
}
return time.Time{}
}
// ToFileInfo converts xlMetaV2 into a common FileInfo datastructure // ToFileInfo converts xlMetaV2 into a common FileInfo datastructure
// for consumption across callers. // for consumption across callers.
func (z xlMetaV2) ToFileInfo(volume, path, versionID string) (fi FileInfo, err error) { func (z xlMetaV2) ToFileInfo(volume, path, versionID string) (fi FileInfo, err error) {
@ -1338,6 +1339,7 @@ func (z xlMetaV2) ToFileInfo(volume, path, versionID string) (fi FileInfo, err e
} }
} }
orderedVersions := make([]xlMetaV2Version, 0, len(z.Versions))
for _, version := range z.Versions { for _, version := range z.Versions {
if !version.Valid() { if !version.Valid() {
logger.LogIf(GlobalContext, fmt.Errorf("invalid version detected %#v", version)) logger.LogIf(GlobalContext, fmt.Errorf("invalid version detected %#v", version))
@ -1347,27 +1349,18 @@ func (z xlMetaV2) ToFileInfo(volume, path, versionID string) (fi FileInfo, err e
return FileInfo{}, errFileVersionNotFound return FileInfo{}, errFileVersionNotFound
} }
}
orderedVersions := make([]xlMetaV2Version, len(z.Versions))
copy(orderedVersions, z.Versions)
n := 0
for _, version := range orderedVersions {
// skip listing free-version unless explicitly requested via versionID // skip listing free-version unless explicitly requested via versionID
if version.FreeVersion() && version.DeleteMarker.VersionID != uv { if version.FreeVersion() && version.DeleteMarker.VersionID != uv {
continue continue
} }
orderedVersions[n] = version orderedVersions = append(orderedVersions, version)
n++
} }
orderedVersions = orderedVersions[:n]
sort.Slice(orderedVersions, func(i, j int) bool { if len(orderedVersions) > 1 {
mtime1 := getModTimeFromVersion(orderedVersions[i]) sort.Slice(orderedVersions, func(i, j int) bool {
mtime2 := getModTimeFromVersion(orderedVersions[j]) return orderedVersions[i].getModTime().After(orderedVersions[j].getModTime())
return mtime1.After(mtime2) })
}) }
if versionID == "" { if versionID == "" {
if len(orderedVersions) >= 1 { if len(orderedVersions) >= 1 {
@ -1403,7 +1396,7 @@ func (z xlMetaV2) ToFileInfo(volume, path, versionID string) (fi FileInfo, err e
break break
} }
case DeleteType: case DeleteType:
if bytes.Equal(orderedVersions[i].DeleteMarker.VersionID[:], uv[:]) { if orderedVersions[i].DeleteMarker.VersionID == uv {
fi, err = orderedVersions[i].DeleteMarker.ToFileInfo(volume, path) fi, err = orderedVersions[i].DeleteMarker.ToFileInfo(volume, path)
foundIndex = i foundIndex = i
break break
@ -1419,7 +1412,7 @@ func (z xlMetaV2) ToFileInfo(volume, path, versionID string) (fi FileInfo, err e
fi.IsLatest = foundIndex == 0 fi.IsLatest = foundIndex == 0
fi.NumVersions = len(z.Versions) fi.NumVersions = len(z.Versions)
if foundIndex > 0 { if foundIndex > 0 {
fi.SuccessorModTime = getModTimeFromVersion(orderedVersions[foundIndex-1]) fi.SuccessorModTime = orderedVersions[foundIndex-1].getModTime()
} }
return fi, nil return fi, nil
} }