diff --git a/cmd/fs-v1-helpers.go b/cmd/fs-v1-helpers.go index f16948d58..fc8551e68 100644 --- a/cmd/fs-v1-helpers.go +++ b/cmd/fs-v1-helpers.go @@ -24,6 +24,7 @@ import ( pathutil "path" "runtime" "strings" + "time" "github.com/minio/minio/internal/lock" "github.com/minio/minio/internal/logger" @@ -168,6 +169,25 @@ func fsStat(ctx context.Context, statLoc string) (os.FileInfo, error) { return fi, nil } +// fsTouch updates a file access & modtime with current time +func fsTouch(ctx context.Context, statLoc string) error { + if statLoc == "" { + logger.LogIf(ctx, errInvalidArgument) + return errInvalidArgument + } + if err := checkPathLength(statLoc); err != nil { + logger.LogIf(ctx, err) + return err + } + now := time.Now() + if err := os.Chtimes(statLoc, now, now); err != nil { + logger.LogIf(ctx, err) + return err + } + + return nil +} + // Lookup if volume exists, returns volume attributes upon success. func fsStatVolume(ctx context.Context, volume string) (os.FileInfo, error) { fi, err := fsStat(ctx, volume) diff --git a/cmd/fs-v1.go b/cmd/fs-v1.go index ba6ad49a4..dc550d4fb 100644 --- a/cmd/fs-v1.go +++ b/cmd/fs-v1.go @@ -682,8 +682,15 @@ func (fs *FSObjects) CopyObject(ctx context.Context, srcBucket, srcObject, dstBu return oi, toObjectErr(err, srcBucket, srcObject) } - // Stat the file to get file size. - fi, err := fsStatFile(ctx, pathJoin(fs.fsPath, srcBucket, srcObject)) + fsObjectPath := pathJoin(fs.fsPath, srcBucket, srcObject) + + // Update object modtime + err = fsTouch(ctx, fsObjectPath) + if err != nil { + return oi, toObjectErr(err, srcBucket, srcObject) + } + // Stat the file to get object info + fi, err := fsStatFile(ctx, fsObjectPath) if err != nil { return oi, toObjectErr(err, srcBucket, srcObject) }