mirror of
https://github.com/minio/minio.git
synced 2025-11-07 21:02:58 -05:00
Add a 'free' version to track deletion of tiered object content (#12470)
This commit is contained in:
committed by
GitHub
parent
dc6958b6a1
commit
a1df230518
@@ -102,6 +102,11 @@ func isXL2V1Format(buf []byte) bool {
|
||||
//
|
||||
// The most recently updated element in the array is considered the latest version.
|
||||
|
||||
// In addition to these we have a special kind called free-version. This is represented
|
||||
// using a delete-marker and MetaSys entries. It's used to track tiered content of a
|
||||
// deleted/overwritten version. This version is visible _only_to the scanner routine, for subsequent deletion.
|
||||
// This kind of tracking is necessary since a version's tiered content is deleted asynchronously.
|
||||
|
||||
// Backend directory tree structure:
|
||||
// disk1/
|
||||
// └── bucket
|
||||
@@ -856,8 +861,17 @@ func (z *xlMetaV2) AddVersion(fi FileInfo) error {
|
||||
ventry.ObjectV2.PartActualSizes[i] = fi.Parts[i].ActualSize
|
||||
}
|
||||
|
||||
tierFVIDKey := ReservedMetadataPrefixLower + tierFVID
|
||||
tierFVMarkerKey := ReservedMetadataPrefixLower + tierFVMarker
|
||||
for k, v := range fi.Metadata {
|
||||
if strings.HasPrefix(strings.ToLower(k), ReservedMetadataPrefixLower) {
|
||||
// Skip tierFVID, tierFVMarker keys; it's used
|
||||
// only for creating free-version.
|
||||
switch k {
|
||||
case tierFVIDKey, tierFVMarkerKey:
|
||||
continue
|
||||
}
|
||||
|
||||
ventry.ObjectV2.MetaSys[k] = []byte(v)
|
||||
} else {
|
||||
ventry.ObjectV2.MetaUser[k] = v
|
||||
@@ -942,6 +956,13 @@ func (j xlMetaV2DeleteMarker) ToFileInfo(volume, path string) (FileInfo, error)
|
||||
fi.VersionPurgeStatus = VersionPurgeStatusType(string(v))
|
||||
}
|
||||
}
|
||||
if j.FreeVersion() {
|
||||
fi.SetTierFreeVersion()
|
||||
fi.TransitionTier = string(j.MetaSys[ReservedMetadataPrefixLower+TransitionTier])
|
||||
fi.TransitionedObjName = string(j.MetaSys[ReservedMetadataPrefixLower+TransitionedObjectName])
|
||||
fi.TransitionVersionID = string(j.MetaSys[ReservedMetadataPrefixLower+TransitionedVersionID])
|
||||
}
|
||||
|
||||
return fi, nil
|
||||
}
|
||||
|
||||
@@ -1198,6 +1219,12 @@ func (z *xlMetaV2) DeleteVersion(fi FileInfo) (string, bool, error) {
|
||||
z.Versions[i].ObjectV2.MetaSys[ReservedMetadataPrefixLower+TransitionTier] = []byte(fi.TransitionTier)
|
||||
default:
|
||||
z.Versions = append(z.Versions[:i], z.Versions[i+1:]...)
|
||||
// if uv has tiered content we add a
|
||||
// free-version to track it for
|
||||
// asynchronous deletion via scanner.
|
||||
if freeVersion, toFree := version.ObjectV2.InitFreeVersion(fi); toFree {
|
||||
z.Versions = append(z.Versions, freeVersion)
|
||||
}
|
||||
}
|
||||
|
||||
if fi.Deleted {
|
||||
@@ -1311,6 +1338,17 @@ func (z xlMetaV2) ToFileInfo(volume, path, versionID string) (fi FileInfo, err e
|
||||
|
||||
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
|
||||
if version.FreeVersion() && version.DeleteMarker.VersionID != uv {
|
||||
continue
|
||||
}
|
||||
orderedVersions[n] = version
|
||||
n++
|
||||
|
||||
}
|
||||
orderedVersions = orderedVersions[:n]
|
||||
|
||||
sort.Slice(orderedVersions, func(i, j int) bool {
|
||||
mtime1 := getModTimeFromVersion(orderedVersions[i])
|
||||
@@ -1340,7 +1378,7 @@ func (z xlMetaV2) ToFileInfo(volume, path, versionID string) (fi FileInfo, err e
|
||||
for i := range orderedVersions {
|
||||
switch orderedVersions[i].Type {
|
||||
case ObjectType:
|
||||
if bytes.Equal(orderedVersions[i].ObjectV2.VersionID[:], uv[:]) {
|
||||
if orderedVersions[i].ObjectV2.VersionID == uv {
|
||||
fi, err = orderedVersions[i].ObjectV2.ToFileInfo(volume, path)
|
||||
foundIndex = i
|
||||
break
|
||||
|
||||
Reference in New Issue
Block a user