From 1760687c83aa43f8d2ba99d44d0ba12f5fa88be8 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Mon, 16 May 2016 15:40:57 -0700 Subject: [PATCH] XL: Make sure to create proper temporary files for renames to succeed. (#1654) Renames work in a special manner, temporary location files should be created properly. Fixes #1653 Fixes #1651 --- object-common-multipart.go | 6 ++++-- xl-objects-multipart.go | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/object-common-multipart.go b/object-common-multipart.go index f63ced54f..81c9116bd 100644 --- a/object-common-multipart.go +++ b/object-common-multipart.go @@ -39,7 +39,8 @@ const ( func createUploadsJSON(storage StorageAPI, bucket, object, uploadID string) error { // Place holder uploads.json uploadsPath := path.Join(mpartMetaPrefix, bucket, object, uploadsJSONFile) - tmpUploadsPath := path.Join(tmpMetaPrefix, bucket, object, uploadID, uploadsJSONFile) + uploadsJSONSuffix := fmt.Sprintf("%s.%s", uploadID, uploadsJSONFile) + tmpUploadsPath := path.Join(tmpMetaPrefix, bucket, object, uploadsJSONSuffix) w, err := storage.CreateFile(minioMetaBucket, uploadsPath) if err != nil { return err @@ -98,7 +99,8 @@ func newMultipartUploadCommon(storage StorageAPI, bucket string, object string) return "", err } uploadIDPath := path.Join(mpartMetaPrefix, bucket, object, uploadID, incompleteFile) - tempUploadIDPath := path.Join(tmpMetaPrefix, bucket, object, uploadID, incompleteFile) + incompleteSuffix := fmt.Sprintf("%s.%s", uploadID, incompleteFile) + tempUploadIDPath := path.Join(tmpMetaPrefix, bucket, object, incompleteSuffix) if _, err = storage.StatFile(minioMetaBucket, uploadIDPath); err != nil { if err != errFileNotFound { return "", toObjectErr(err, minioMetaBucket, uploadIDPath) diff --git a/xl-objects-multipart.go b/xl-objects-multipart.go index 6da8488d2..608771769 100644 --- a/xl-objects-multipart.go +++ b/xl-objects-multipart.go @@ -183,7 +183,8 @@ func (xl xlObjects) CompleteMultipartUpload(bucket string, object string, upload metadata.ModTime = time.Now().UTC() // Create temporary multipart meta file to write and then rename. - tempMultipartMetaFile := path.Join(tmpMetaPrefix, bucket, object, uploadID, multipartMetaFile) + multipartMetaSuffix := fmt.Sprintf("%s.%s", uploadID, multipartMetaFile) + tempMultipartMetaFile := path.Join(tmpMetaPrefix, bucket, object, multipartMetaSuffix) w, err := xl.storage.CreateFile(minioMetaBucket, tempMultipartMetaFile) if err != nil { return "", toObjectErr(err, bucket, object)