Merge pull request #264 from botdeniska/fix/free-versions-not-versions

fix(ilm): stop taking the free versions of deleted tiered versions for versions
This commit is contained in:
Feng Ruohang
2026-11-01 14:44:22 +08:00
committed by GitHub
9 changed files with 639 additions and 24 deletions
+23 -11
View File
@@ -1138,6 +1138,17 @@ func (x *xlMetaV2) latestModtime() time.Time {
return time.Unix(0, x.versions[0].header.ModTime)
}
// isLatestDeleteMarker returns true if the latest version that is not a free
// version is a delete marker, or if there is none.
func (x *xlMetaV2) isLatestDeleteMarker() bool {
for _, ver := range x.versions {
if !ver.header.FreeVersion() {
return ver.header.Type == DeleteType
}
}
return true
}
func (x *xlMetaV2) addVersion(ver xlMetaV2Version) error {
modTime := ver.getModTime().UnixNano()
if !ver.Valid() {
@@ -2291,6 +2302,7 @@ func (x xlMetaBuf) ListVersions(volume, path string, allParts bool) ([]FileInfo,
}
// IsLatestDeleteMarker returns true if latest version is a deletemarker or there are no versions.
// Free versions are not versions of the object and are skipped.
// If any error occurs false is returned.
func (x xlMetaBuf) IsLatestDeleteMarker() bool {
vers, headerV, _, buf, err := decodeXLHeaders(x)
@@ -2300,13 +2312,17 @@ func (x xlMetaBuf) IsLatestDeleteMarker() bool {
if vers == 0 {
return true
}
isDeleteMarker := false
isDeleteMarker := true // only free versions
_ = decodeVersions(buf, vers, func(idx int, hdr, _ []byte) error {
var xl xlMetaV2VersionHeader
if _, err := xl.unmarshalV(headerV, hdr); err != nil {
isDeleteMarker = false
return errDoneForNow
}
if xl.FreeVersion() {
return nil
}
isDeleteMarker = xl.Type == DeleteType
return errDoneForNow
})
@@ -2314,7 +2330,7 @@ func (x xlMetaBuf) IsLatestDeleteMarker() bool {
}
// AllHidden returns true are no versions that would show up in a listing (ie all free markers)
// Optionally also return early if top is a delete marker.
// Optionally also return early if the top version that is not free is a delete marker.
func (x xlMetaBuf) AllHidden(topDeleteMarker bool) bool {
vers, headerV, _, buf, err := decodeXLHeaders(x)
if err != nil {
@@ -2330,16 +2346,12 @@ func (x xlMetaBuf) AllHidden(topDeleteMarker bool) bool {
if _, err := xl.unmarshalV(headerV, hdr); err != nil {
return errDoneForNow
}
if topDeleteMarker && idx == 0 && xl.Type == DeleteType {
hidden = true
return errDoneForNow
if xl.FreeVersion() {
// Check next version
return nil
}
if !xl.FreeVersion() {
hidden = false
return errDoneForNow
}
// Check next version
return nil
hidden = topDeleteMarker && xl.Type == DeleteType
return errDoneForNow
})
return hidden
}