mirror of
https://github.com/minio/minio.git
synced 2024-12-25 22:55:54 -05:00
Ignore file not found error for multipart-uploads (#5065)
Dont print the error errFileNotFound, as it is expected that concurrent complete-multipart-uploads or abort-multipart-uploads would have deleted the file, and the file may not be found Fixes: https://github.com/minio/minio/issues/5056
This commit is contained in:
parent
f25bec6bf1
commit
8287ab091c
@ -744,8 +744,14 @@ func (fs fsObjects) CompleteMultipartUpload(bucket string, object string, upload
|
|||||||
if removeObjectDir {
|
if removeObjectDir {
|
||||||
basePath := pathJoin(fs.fsPath, minioMetaMultipartBucket, bucket)
|
basePath := pathJoin(fs.fsPath, minioMetaMultipartBucket, bucket)
|
||||||
derr := fsDeleteFile(basePath, pathJoin(basePath, object))
|
derr := fsDeleteFile(basePath, pathJoin(basePath, object))
|
||||||
|
if derr = errorCause(derr); derr != nil {
|
||||||
|
// In parallel execution, CompleteMultipartUpload could have deleted temporary
|
||||||
|
// state files/directory, it is safe to ignore errFileNotFound
|
||||||
|
if derr != errFileNotFound {
|
||||||
errorIf(derr, "unable to remove %s in %s", pathJoin(basePath, object), basePath)
|
errorIf(derr, "unable to remove %s in %s", pathJoin(basePath, object), basePath)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
objectMPartPathLock.Unlock()
|
objectMPartPathLock.Unlock()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -979,8 +985,14 @@ func (fs fsObjects) AbortMultipartUpload(bucket, object, uploadID string) error
|
|||||||
if removeObjectDir {
|
if removeObjectDir {
|
||||||
basePath := pathJoin(fs.fsPath, minioMetaMultipartBucket, bucket)
|
basePath := pathJoin(fs.fsPath, minioMetaMultipartBucket, bucket)
|
||||||
derr := fsDeleteFile(basePath, pathJoin(basePath, object))
|
derr := fsDeleteFile(basePath, pathJoin(basePath, object))
|
||||||
|
if derr = errorCause(derr); derr != nil {
|
||||||
|
// In parallel execution, AbortMultipartUpload could have deleted temporary
|
||||||
|
// state files/directory, it is safe to ignore errFileNotFound
|
||||||
|
if derr != errFileNotFound {
|
||||||
errorIf(derr, "unable to remove %s in %s", pathJoin(basePath, object), basePath)
|
errorIf(derr, "unable to remove %s in %s", pathJoin(basePath, object), basePath)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
objectMPartPathLock.Unlock()
|
objectMPartPathLock.Unlock()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@ -226,6 +226,72 @@ func TestCompleteMultipartUploadFaultyDisk(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestCompleteMultipartUploadFaultyDisk - test CompleteMultipartUpload with faulty disks
|
||||||
|
func TestCompleteMultipartUpload(t *testing.T) {
|
||||||
|
// Prepare for tests
|
||||||
|
disk := filepath.Join(globalTestTmpDir, "minio-"+nextSuffix())
|
||||||
|
defer os.RemoveAll(disk)
|
||||||
|
obj := initFSObjects(disk, t)
|
||||||
|
|
||||||
|
fs := obj.(*fsObjects)
|
||||||
|
bucketName := "bucket"
|
||||||
|
objectName := "object"
|
||||||
|
data := []byte("12345")
|
||||||
|
|
||||||
|
if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
|
||||||
|
t.Fatal("Cannot create bucket, err: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
uploadID, err := fs.NewMultipartUpload(bucketName, objectName, map[string]string{"X-Amz-Meta-xid": "3f"})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Unexpected error ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
md5Hex := getMD5Hash(data)
|
||||||
|
|
||||||
|
if _, err := fs.PutObjectPart(bucketName, objectName, uploadID, 1, NewHashReader(bytes.NewReader(data), 5, md5Hex, "")); err != nil {
|
||||||
|
t.Fatal("Unexpected error ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
parts := []completePart{{PartNumber: 1, ETag: md5Hex}}
|
||||||
|
|
||||||
|
if _, err := fs.CompleteMultipartUpload(bucketName, objectName, uploadID, parts); err != nil {
|
||||||
|
t.Fatal("Unexpected error ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestCompleteMultipartUploadFaultyDisk - test CompleteMultipartUpload with faulty disks
|
||||||
|
func TestAbortMultipartUpload(t *testing.T) {
|
||||||
|
// Prepare for tests
|
||||||
|
disk := filepath.Join(globalTestTmpDir, "minio-"+nextSuffix())
|
||||||
|
defer os.RemoveAll(disk)
|
||||||
|
obj := initFSObjects(disk, t)
|
||||||
|
|
||||||
|
fs := obj.(*fsObjects)
|
||||||
|
bucketName := "bucket"
|
||||||
|
objectName := "object"
|
||||||
|
data := []byte("12345")
|
||||||
|
|
||||||
|
if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
|
||||||
|
t.Fatal("Cannot create bucket, err: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
uploadID, err := fs.NewMultipartUpload(bucketName, objectName, map[string]string{"X-Amz-Meta-xid": "3f"})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Unexpected error ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
md5Hex := getMD5Hash(data)
|
||||||
|
|
||||||
|
if _, err := fs.PutObjectPart(bucketName, objectName, uploadID, 1, NewHashReader(bytes.NewReader(data), 5, md5Hex, "")); err != nil {
|
||||||
|
t.Fatal("Unexpected error ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := fs.AbortMultipartUpload(bucketName, objectName, uploadID); err != nil {
|
||||||
|
t.Fatal("Unexpected error ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TestListMultipartUploadsFaultyDisk - test ListMultipartUploads with faulty disks
|
// TestListMultipartUploadsFaultyDisk - test ListMultipartUploads with faulty disks
|
||||||
func TestListMultipartUploadsFaultyDisk(t *testing.T) {
|
func TestListMultipartUploadsFaultyDisk(t *testing.T) {
|
||||||
// Prepare for tests
|
// Prepare for tests
|
||||||
|
Loading…
Reference in New Issue
Block a user