diff --git a/cmd/fs-v1-background-append.go b/cmd/fs-v1-background-append.go index 59de9295e..06f8a2702 100644 --- a/cmd/fs-v1-background-append.go +++ b/cmd/fs-v1-background-append.go @@ -115,13 +115,14 @@ func (b *backgroundAppend) complete(disk StorageAPI, bucket, object, uploadID st // Called after complete-multipart-upload or abort-multipart-upload so that the appendParts go-routine is not left dangling. func (b *backgroundAppend) abort(uploadID string) { b.Lock() - defer b.Unlock() info, ok := b.infoMap[uploadID] if !ok { + b.Unlock() return } delete(b.infoMap, uploadID) - close(info.abortCh) + b.Unlock() + info.abortCh <- struct{}{} } // This is run as a go-routine that appends the parts in the background. diff --git a/cmd/fs-v1-multipart.go b/cmd/fs-v1-multipart.go index 5e336a699..6003d66fe 100644 --- a/cmd/fs-v1-multipart.go +++ b/cmd/fs-v1-multipart.go @@ -637,11 +637,12 @@ func (fs fsObjects) CompleteMultipartUpload(bucket string, object string, upload // the directory at '.minio.sys/multipart/bucket/object/uploadID' holding // all the upload parts. func (fs fsObjects) abortMultipartUpload(bucket, object, uploadID string) error { + // Signal appendParts routine to stop waiting for new parts to arrive. + fs.bgAppend.abort(uploadID) // Cleanup all uploaded parts. if err := cleanupUploadedParts(bucket, object, uploadID, fs.storage); err != nil { return err } - fs.bgAppend.abort(uploadID) // remove entry from uploads.json with quorum if err := fs.removeUploadID(bucket, object, uploadID); err != nil { return toObjectErr(err, bucket, object)