mirror of
https://github.com/minio/minio.git
synced 2025-01-11 15:03:22 -05:00
xl: ListObjectParts uses the latest valid xl meta (#7184)
ListObjectParts is using xl.readXLMetaParts which picks the first xl meta found in any disk, which is an inconsistent information. E.g.: In a middle of a multipart upload, one node can go offline and get back later with an outdated multipart information.
This commit is contained in:
parent
32a6dd1dd6
commit
de2c106386
@ -505,11 +505,33 @@ func (xl xlObjects) ListObjectParts(ctx context.Context, bucket, object, uploadI
|
|||||||
|
|
||||||
uploadIDPath := xl.getUploadIDDir(bucket, object, uploadID)
|
uploadIDPath := xl.getUploadIDDir(bucket, object, uploadID)
|
||||||
|
|
||||||
xlParts, xlMeta, err := xl.readXLMetaParts(ctx, minioMetaMultipartBucket, uploadIDPath)
|
storageDisks := xl.getDisks()
|
||||||
|
|
||||||
|
// Read metadata associated with the object from all disks.
|
||||||
|
partsMetadata, errs := readAllXLMetadata(ctx, storageDisks, minioMetaMultipartBucket, uploadIDPath)
|
||||||
|
|
||||||
|
// get Quorum for this object
|
||||||
|
_, writeQuorum, err := objectQuorumFromMeta(ctx, xl, partsMetadata, errs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return result, toObjectErr(err, minioMetaMultipartBucket, uploadIDPath)
|
return result, toObjectErr(err, minioMetaMultipartBucket, uploadIDPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reducedErr := reduceWriteQuorumErrs(ctx, errs, objectOpIgnoredErrs, writeQuorum)
|
||||||
|
if reducedErr == errXLWriteQuorum {
|
||||||
|
return result, toObjectErr(err, minioMetaMultipartBucket, uploadIDPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, modTime := listOnlineDisks(storageDisks, partsMetadata, errs)
|
||||||
|
|
||||||
|
// Pick one from the first valid metadata.
|
||||||
|
xlValidMeta, err := pickValidXLMeta(ctx, partsMetadata, modTime, writeQuorum)
|
||||||
|
if err != nil {
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var xlMeta = xlValidMeta.Meta
|
||||||
|
var xlParts = xlValidMeta.Parts
|
||||||
|
|
||||||
// Populate the result stub.
|
// Populate the result stub.
|
||||||
result.Bucket = bucket
|
result.Bucket = bucket
|
||||||
result.Object = object
|
result.Object = object
|
||||||
|
Loading…
Reference in New Issue
Block a user