From 4c81201f95bb83443fe5b8a188cc44e0fb56dc2b Mon Sep 17 00:00:00 2001 From: Anis Elleuch Date: Mon, 21 Sep 2020 23:16:16 +0100 Subject: [PATCH] fix: healing delete marker on versioned buckets (#10530) Healing was not working correctly in the distributed mode because errFileVersionNotFound was not properly converted in storage rest client. Besides, fixing the healing delete marker is not working as expected. --- cmd/erasure-healing.go | 2 +- cmd/storage-rest-client.go | 2 ++ cmd/xl-storage-format-v2.go | 57 ++++++++++++++++++++++--------------- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/cmd/erasure-healing.go b/cmd/erasure-healing.go index a25ccd510..b915b9dfd 100644 --- a/cmd/erasure-healing.go +++ b/cmd/erasure-healing.go @@ -265,7 +265,7 @@ func (er erasureObjects) healObject(ctx context.Context, bucket string, object s } case errs[i] == errDiskNotFound, dataErrs[i] == errDiskNotFound: driveState = madmin.DriveStateOffline - case errs[i] == errFileNotFound, errs[i] == errVolumeNotFound: + case errs[i] == errFileNotFound, errs[i] == errFileVersionNotFound, errs[i] == errVolumeNotFound: fallthrough case dataErrs[i] == errFileNotFound, dataErrs[i] == errFileVersionNotFound, dataErrs[i] == errVolumeNotFound: driveState = madmin.DriveStateMissing diff --git a/cmd/storage-rest-client.go b/cmd/storage-rest-client.go index 8ea0d91e6..438364689 100644 --- a/cmd/storage-rest-client.go +++ b/cmd/storage-rest-client.go @@ -75,6 +75,8 @@ func toStorageErr(err error) error { return errVolumeExists case errFileNotFound.Error(): return errFileNotFound + case errFileVersionNotFound.Error(): + return errFileVersionNotFound case errFileNameTooLong.Error(): return errFileNameTooLong case errFileAccessDenied.Error(): diff --git a/cmd/xl-storage-format-v2.go b/cmd/xl-storage-format-v2.go index a9ba76601..4f697109e 100644 --- a/cmd/xl-storage-format-v2.go +++ b/cmd/xl-storage-format-v2.go @@ -244,14 +244,25 @@ func (z *xlMetaV2) AddVersion(fi FileInfo) error { } } - dd, err := uuid.Parse(fi.DataDir) - if err != nil { - return err + var dd uuid.UUID + if fi.DataDir != "" { + dd, err = uuid.Parse(fi.DataDir) + if err != nil { + return err + } } - ventry := xlMetaV2Version{ - Type: ObjectType, - ObjectV2: &xlMetaV2Object{ + ventry := xlMetaV2Version{} + + if fi.Deleted { + ventry.Type = DeleteType + ventry.DeleteMarker = &xlMetaV2DeleteMarker{ + VersionID: uv, + ModTime: fi.ModTime.UnixNano(), + } + } else { + ventry.Type = ObjectType + ventry.ObjectV2 = &xlMetaV2Object{ VersionID: uv, DataDir: dd, Size: fi.Size, @@ -269,27 +280,27 @@ func (z *xlMetaV2) AddVersion(fi FileInfo) error { PartActualSizes: make([]int64, len(fi.Parts)), MetaSys: make(map[string][]byte), MetaUser: make(map[string]string, len(fi.Metadata)), - }, - } + } - for i := range fi.Erasure.Distribution { - ventry.ObjectV2.ErasureDist[i] = uint8(fi.Erasure.Distribution[i]) - } + for i := range fi.Erasure.Distribution { + ventry.ObjectV2.ErasureDist[i] = uint8(fi.Erasure.Distribution[i]) + } - for i := range fi.Parts { - ventry.ObjectV2.PartSizes[i] = fi.Parts[i].Size - if fi.Parts[i].ETag != "" { - ventry.ObjectV2.PartETags[i] = fi.Parts[i].ETag + for i := range fi.Parts { + ventry.ObjectV2.PartSizes[i] = fi.Parts[i].Size + if fi.Parts[i].ETag != "" { + ventry.ObjectV2.PartETags[i] = fi.Parts[i].ETag + } + ventry.ObjectV2.PartNumbers[i] = fi.Parts[i].Number + ventry.ObjectV2.PartActualSizes[i] = fi.Parts[i].ActualSize } - ventry.ObjectV2.PartNumbers[i] = fi.Parts[i].Number - ventry.ObjectV2.PartActualSizes[i] = fi.Parts[i].ActualSize - } - for k, v := range fi.Metadata { - if strings.HasPrefix(strings.ToLower(k), ReservedMetadataPrefixLower) { - ventry.ObjectV2.MetaSys[k] = []byte(v) - } else { - ventry.ObjectV2.MetaUser[k] = v + for k, v := range fi.Metadata { + if strings.HasPrefix(strings.ToLower(k), ReservedMetadataPrefixLower) { + ventry.ObjectV2.MetaSys[k] = []byte(v) + } else { + ventry.ObjectV2.MetaUser[k] = v + } } }