mirror of
https://github.com/minio/minio.git
synced 2025-04-22 11:26:36 -04:00
Skip transitioning of object versions if inlined (#12705)
This commit is contained in:
parent
b0b4696a64
commit
29eea52e14
@ -267,7 +267,7 @@ func (er erasureObjects) getObjectWithFileInfo(ctx context.Context, bucket, obje
|
|||||||
// due to a bug in RenameData() the fi.Data is not niled leading to
|
// due to a bug in RenameData() the fi.Data is not niled leading to
|
||||||
// GetObject thinking that fi.Data is valid while fi.Size has
|
// GetObject thinking that fi.Data is valid while fi.Size has
|
||||||
// changed already.
|
// changed already.
|
||||||
if _, ok := fi.Metadata[ReservedMetadataPrefixLower+"inline-data"]; ok {
|
if fi.InlineData() {
|
||||||
shardFileSize := erasure.ShardFileSize(fi.Size)
|
shardFileSize := erasure.ShardFileSize(fi.Size)
|
||||||
if shardFileSize >= 0 && shardFileSize >= smallFileThreshold {
|
if shardFileSize >= 0 && shardFileSize >= smallFileThreshold {
|
||||||
for i := range metaArr {
|
for i := range metaArr {
|
||||||
@ -816,7 +816,7 @@ func (er erasureObjects) putObject(ctx context.Context, bucket string, object st
|
|||||||
if len(inlineBuffers) > 0 {
|
if len(inlineBuffers) > 0 {
|
||||||
// Set an additional header when data is inlined.
|
// Set an additional header when data is inlined.
|
||||||
for index := range partsMetadata {
|
for index := range partsMetadata {
|
||||||
partsMetadata[index].Metadata[ReservedMetadataPrefixLower+"inline-data"] = "true"
|
partsMetadata[index].SetInlineData()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1393,6 +1393,12 @@ func (er erasureObjects) TransitionObject(ctx context.Context, bucket, object st
|
|||||||
return toObjectErr(err, bucket, object)
|
return toObjectErr(err, bucket, object)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// object content is small enough that it's inlined, skipping transition
|
||||||
|
if fi.InlineData() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
destObj, err := genTransitionObjName()
|
destObj, err := genTransitionObjName()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -181,6 +181,17 @@ type FileInfo struct {
|
|||||||
SuccessorModTime time.Time
|
SuccessorModTime time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InlineData returns true if object contents are inlined alongside its metadata.
|
||||||
|
func (fi FileInfo) InlineData() bool {
|
||||||
|
_, ok := fi.Metadata[ReservedMetadataPrefixLower+"inline-data"]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetInlineData marks object (version) as inline.
|
||||||
|
func (fi FileInfo) SetInlineData() {
|
||||||
|
fi.Metadata[ReservedMetadataPrefixLower+"inline-data"] = "true"
|
||||||
|
}
|
||||||
|
|
||||||
// VersionPurgeStatusKey denotes purge status in metadata
|
// VersionPurgeStatusKey denotes purge status in metadata
|
||||||
const VersionPurgeStatusKey = "purgestatus"
|
const VersionPurgeStatusKey = "purgestatus"
|
||||||
|
|
||||||
|
@ -970,7 +970,7 @@ func (j xlMetaV2DeleteMarker) ToFileInfo(volume, path string) (FileInfo, error)
|
|||||||
|
|
||||||
// UsesDataDir returns true if this object version uses its data directory for
|
// UsesDataDir returns true if this object version uses its data directory for
|
||||||
// its contents and false otherwise.
|
// its contents and false otherwise.
|
||||||
func (j *xlMetaV2Object) UsesDataDir() bool {
|
func (j xlMetaV2Object) UsesDataDir() bool {
|
||||||
// Skip if this version is not transitioned, i.e it uses its data directory.
|
// Skip if this version is not transitioned, i.e it uses its data directory.
|
||||||
if !bytes.Equal(j.MetaSys[ReservedMetadataPrefixLower+TransitionStatus], []byte(lifecycle.TransitionComplete)) {
|
if !bytes.Equal(j.MetaSys[ReservedMetadataPrefixLower+TransitionStatus], []byte(lifecycle.TransitionComplete)) {
|
||||||
return true
|
return true
|
||||||
@ -980,6 +980,19 @@ func (j *xlMetaV2Object) UsesDataDir() bool {
|
|||||||
return isRestoredObjectOnDisk(j.MetaUser)
|
return isRestoredObjectOnDisk(j.MetaUser)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (j *xlMetaV2Object) SetTransition(fi FileInfo) {
|
||||||
|
j.MetaSys[ReservedMetadataPrefixLower+TransitionStatus] = []byte(fi.TransitionStatus)
|
||||||
|
j.MetaSys[ReservedMetadataPrefixLower+TransitionedObjectName] = []byte(fi.TransitionedObjName)
|
||||||
|
j.MetaSys[ReservedMetadataPrefixLower+TransitionedVersionID] = []byte(fi.TransitionVersionID)
|
||||||
|
j.MetaSys[ReservedMetadataPrefixLower+TransitionTier] = []byte(fi.TransitionTier)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (j *xlMetaV2Object) RemoveRestoreHdrs() {
|
||||||
|
delete(j.MetaUser, xhttp.AmzRestore)
|
||||||
|
delete(j.MetaUser, xhttp.AmzRestoreExpiryDays)
|
||||||
|
delete(j.MetaUser, xhttp.AmzRestoreRequestDate)
|
||||||
|
}
|
||||||
|
|
||||||
func (j xlMetaV2Object) ToFileInfo(volume, path string) (FileInfo, error) {
|
func (j xlMetaV2Object) ToFileInfo(volume, path string) (FileInfo, error) {
|
||||||
versionID := ""
|
versionID := ""
|
||||||
var uv uuid.UUID
|
var uv uuid.UUID
|
||||||
@ -1211,14 +1224,11 @@ func (z *xlMetaV2) DeleteVersion(fi FileInfo) (string, bool, error) {
|
|||||||
if version.ObjectV2.VersionID == uv {
|
if version.ObjectV2.VersionID == uv {
|
||||||
switch {
|
switch {
|
||||||
case fi.ExpireRestored:
|
case fi.ExpireRestored:
|
||||||
delete(z.Versions[i].ObjectV2.MetaUser, xhttp.AmzRestore)
|
z.Versions[i].ObjectV2.RemoveRestoreHdrs()
|
||||||
delete(z.Versions[i].ObjectV2.MetaUser, xhttp.AmzRestoreExpiryDays)
|
|
||||||
delete(z.Versions[i].ObjectV2.MetaUser, xhttp.AmzRestoreRequestDate)
|
|
||||||
case fi.TransitionStatus == lifecycle.TransitionComplete:
|
case fi.TransitionStatus == lifecycle.TransitionComplete:
|
||||||
z.Versions[i].ObjectV2.MetaSys[ReservedMetadataPrefixLower+TransitionStatus] = []byte(fi.TransitionStatus)
|
z.Versions[i].ObjectV2.SetTransition(fi)
|
||||||
z.Versions[i].ObjectV2.MetaSys[ReservedMetadataPrefixLower+TransitionedObjectName] = []byte(fi.TransitionedObjName)
|
|
||||||
z.Versions[i].ObjectV2.MetaSys[ReservedMetadataPrefixLower+TransitionedVersionID] = []byte(fi.TransitionVersionID)
|
|
||||||
z.Versions[i].ObjectV2.MetaSys[ReservedMetadataPrefixLower+TransitionTier] = []byte(fi.TransitionTier)
|
|
||||||
default:
|
default:
|
||||||
z.Versions = append(z.Versions[:i], z.Versions[i+1:]...)
|
z.Versions = append(z.Versions[:i], z.Versions[i+1:]...)
|
||||||
// if uv has tiered content we add a
|
// if uv has tiered content we add a
|
||||||
|
@ -1099,8 +1099,8 @@ func (s *xlStorage) ReadVersion(ctx context.Context, volume, path, versionID str
|
|||||||
if readData {
|
if readData {
|
||||||
if len(fi.Data) > 0 || fi.Size == 0 {
|
if len(fi.Data) > 0 || fi.Size == 0 {
|
||||||
if len(fi.Data) > 0 {
|
if len(fi.Data) > 0 {
|
||||||
if _, ok := fi.Metadata[ReservedMetadataPrefixLower+"inline-data"]; !ok {
|
if !fi.InlineData() {
|
||||||
fi.Metadata[ReservedMetadataPrefixLower+"inline-data"] = "true"
|
fi.SetInlineData()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fi, nil
|
return fi, nil
|
||||||
|
Loading…
x
Reference in New Issue
Block a user