fix(ilm): do not let a free version make the latest version noncurrent

Signed-off-by: Denis Babchuk <babchukdenis@icloud.com>
This commit is contained in:
Denis Babchuk
2026-10-29 22:07:56 +03:00
parent dd905b29f4
commit 3f13c26eed
2 changed files with 272 additions and 0 deletions
+16
View File
@@ -19,6 +19,7 @@ package cmd
import (
"errors"
"time"
"github.com/zeebo/xxh3"
)
@@ -28,6 +29,8 @@ import (
// - fivs.FreeVersions has all the free versions
//
// if inclFreeVersions is true all the versions are in fivs.Versions, free and non-free versions alike.
// Otherwise IsLatest, SuccessorModTime and LatestModTime are those of the
// non-free versions.
//
// Note: Only the scanner requires fivs.Versions to have exclusively non-free versions. This is used while enforcing NewerNoncurrentVersions lifecycle element.
func getFileInfoVersions(xlMetaBuf []byte, volume, path string, inclFreeVersions bool) (FileInfoVersions, error) {
@@ -56,6 +59,19 @@ func getFileInfoVersions(xlMetaBuf []byte, volume, path string, inclFreeVersions
}
if !inclFreeVersions {
fivs.Versions = fivs.Versions[:n]
// A free version is not a version of the object. The latest
// version, and the successor of each other version, is among
// the rest.
for i := range fivs.Versions {
fivs.Versions[i].IsLatest = i == 0
fivs.Versions[i].SuccessorModTime = time.Time{}
if i > 0 {
fivs.Versions[i].SuccessorModTime = fivs.Versions[i-1].ModTime
}
}
if n > 0 {
fivs.LatestModTime = fivs.Versions[0].ModTime
}
}
// Update numversions
for i := range fivs.Versions {