diff --git a/cmd/erasure-multipart.go b/cmd/erasure-multipart.go index c0adf7989..13cdea10b 100644 --- a/cmd/erasure-multipart.go +++ b/cmd/erasure-multipart.go @@ -309,20 +309,21 @@ func (er erasureObjects) ListMultipartUploads(ctx context.Context, bucket, objec if populatedUploadIds.Contains(uploadID) { continue } - fi, err := disk.ReadVersion(ctx, minioMetaMultipartBucket, pathJoin(er.getUploadIDDir(bucket, object, uploadID)), "", false) - if err != nil { - if !IsErrIgnored(err, errFileNotFound, errDiskNotFound) { - logger.LogIf(ctx, err) + // If present, use time stored in ID. + startTime := time.Now() + if split := strings.Split(uploadID, "x"); len(split) == 2 { + t, err := strconv.ParseInt(split[1], 10, 64) + if err == nil { + startTime = time.Unix(0, t) } - // Ignore this invalid upload-id since we are listing here - continue } - populatedUploadIds.Add(uploadID) uploads = append(uploads, MultipartInfo{ + Bucket: bucket, Object: object, UploadID: base64.RawURLEncoding.EncodeToString([]byte(fmt.Sprintf("%s.%s", globalDeploymentID(), uploadID))), - Initiated: fi.ModTime, + Initiated: startTime, }) + } sort.Slice(uploads, func(i int, j int) bool { @@ -635,7 +636,8 @@ func (er erasureObjects) PutObjectPart(ctx context.Context, bucket, object, uplo // accommodate concurrent PutObjectPart requests partSuffix := fmt.Sprintf("part.%d", partID) - tmpPart := mustGetUUID() + // Random UUID and timestamp for temporary part file. + tmpPart := fmt.Sprintf("%sx%d", mustGetUUID(), time.Now().UnixNano()) tmpPartPath := pathJoin(tmpPart, partSuffix) // Delete the temporary object part. If PutObjectPart succeeds there would be nothing to delete.