Remove XL multipart tmp files when the latter is canceled (#3214)

XL multipart fails to remove tmp files when an error occurs during upload, this case covers the scenario where an upload is canceled manually by the client in the middle of job.
master
Anis Elleuch 8 years ago committed by Harshavardhana
parent bef0a50bc1
commit 4098025c11
  1. 4
      cmd/object-api-putobject_test.go
  2. 6
      cmd/posix.go
  3. 5
      cmd/xl-v1-multipart.go

@ -23,6 +23,7 @@ import (
"io/ioutil" "io/ioutil"
"os" "os"
"path" "path"
"runtime"
"testing" "testing"
) )
@ -326,6 +327,9 @@ func testObjectAPIPutObjectStaleFiles(obj ObjectLayer, instanceType string, disk
// Wrapper for calling Multipart PutObject tests for both XL multiple disks and single node setup. // Wrapper for calling Multipart PutObject tests for both XL multiple disks and single node setup.
func TestObjectAPIMultipartPutObjectStaleFiles(t *testing.T) { func TestObjectAPIMultipartPutObjectStaleFiles(t *testing.T) {
if runtime.GOOS == "windows" {
return
}
ExecObjectLayerStaleFilesTest(t, testObjectAPIMultipartPutObjectStaleFiles) ExecObjectLayerStaleFilesTest(t, testObjectAPIMultipartPutObjectStaleFiles)
} }

@ -944,5 +944,11 @@ func (s *posix) RenameFile(srcVolume, srcPath, dstVolume, dstPath string) (err e
} }
return err return err
} }
// Remove parent dir of the source file if empty
if parentDir := slashpath.Dir(preparePath(srcFilePath)); isDirEmpty(parentDir) {
deleteFile(srcVolumeDir, parentDir)
}
return nil return nil
} }

@ -394,7 +394,8 @@ func (xl xlObjects) PutObjectPart(bucket, object, uploadID string, partID int, s
partSuffix := fmt.Sprintf("part.%d", partID) partSuffix := fmt.Sprintf("part.%d", partID)
tmpSuffix := getUUID() tmpSuffix := getUUID()
tmpPartPath := tmpSuffix tmpPart := tmpSuffix
tmpPartPath := path.Join(tmpSuffix, partSuffix)
// Initialize md5 writer. // Initialize md5 writer.
md5Writer := md5.New() md5Writer := md5.New()
@ -424,7 +425,7 @@ func (xl xlObjects) PutObjectPart(bucket, object, uploadID string, partID int, s
teeReader := io.TeeReader(lreader, mw) teeReader := io.TeeReader(lreader, mw)
// Delete the temporary object part. If PutObjectPart succeeds there would be nothing to delete. // Delete the temporary object part. If PutObjectPart succeeds there would be nothing to delete.
defer xl.deleteObject(minioMetaTmpBucket, tmpPartPath) defer xl.deleteObject(minioMetaTmpBucket, tmpPart)
if size > 0 { if size > 0 {
for _, disk := range onlineDisks { for _, disk := range onlineDisks {

Loading…
Cancel
Save