From 730d2dc7be4d6d3a18e10d3cdb7214c1e8009d8e Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 15 Sep 2020 09:18:41 -0700 Subject: [PATCH] fix: allow CopyObject/PutObjecTags on pre-existing content (#10485) fixes #10475 --- cmd/fs-v1-metadata.go | 1 - cmd/fs-v1.go | 23 +++++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/cmd/fs-v1-metadata.go b/cmd/fs-v1-metadata.go index b1e108ae8..708aa1d2b 100644 --- a/cmd/fs-v1-metadata.go +++ b/cmd/fs-v1-metadata.go @@ -225,7 +225,6 @@ func (m *fsMetaV1) ReadFrom(ctx context.Context, lk *lock.LockedFile) (n int64, } if len(fsMetaBuf) == 0 { - logger.LogIf(ctx, io.EOF) return 0, io.EOF } diff --git a/cmd/fs-v1.go b/cmd/fs-v1.go index 8cdae2192..82d6fbe34 100644 --- a/cmd/fs-v1.go +++ b/cmd/fs-v1.go @@ -19,6 +19,7 @@ package cmd import ( "bytes" "context" + "errors" "fmt" "io" "io/ioutil" @@ -622,8 +623,15 @@ func (fs *FSObjects) CopyObject(ctx context.Context, srcBucket, srcObject, dstBu fsMetaPath := pathJoin(fs.fsPath, minioMetaBucket, bucketMetaPrefix, srcBucket, srcObject, fs.metaJSONFile) wlk, err := fs.rwPool.Write(fsMetaPath) if err != nil { - logger.LogIf(ctx, err) - return oi, toObjectErr(err, srcBucket, srcObject) + if !errors.Is(err, errFileNotFound) { + logger.LogIf(ctx, err) + return oi, toObjectErr(err, srcBucket, srcObject) + } + wlk, err = fs.rwPool.Create(fsMetaPath) + if err != nil { + logger.LogIf(ctx, err) + return oi, toObjectErr(err, srcBucket, srcObject) + } } // This close will allow for locks to be synchronized on `fs.json`. defer wlk.Close() @@ -1491,8 +1499,15 @@ func (fs *FSObjects) PutObjectTags(ctx context.Context, bucket, object string, t fsMeta := fsMetaV1{} wlk, err := fs.rwPool.Write(fsMetaPath) if err != nil { - logger.LogIf(ctx, err) - return toObjectErr(err, bucket, object) + if !errors.Is(err, errFileNotFound) { + logger.LogIf(ctx, err) + return toObjectErr(err, bucket, object) + } + wlk, err = fs.rwPool.Create(fsMetaPath) + if err != nil { + logger.LogIf(ctx, err) + return toObjectErr(err, bucket, object) + } } // This close will allow for locks to be synchronized on `fs.json`. defer wlk.Close()