mirror of
https://github.com/minio/minio.git
synced 2025-04-21 19:14:39 -04:00
healing: re-read metadata after lock (#12004)
Do no use potentially wrong metadata from before acquiring lock. Plus remove unused NoLock option.
This commit is contained in:
parent
d2ac2f758e
commit
d267d152ba
@ -231,7 +231,7 @@ func shouldHealObjectOnDisk(erErr, dataErr error, meta FileInfo, quorumModTime t
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Heals an object by re-writing corrupt/missing erasure blocks.
|
// Heals an object by re-writing corrupt/missing erasure blocks.
|
||||||
func (er erasureObjects) healObject(ctx context.Context, bucket string, object string, versionID string, partsMetadata []FileInfo, errs []error, opts madmin.HealOpts) (result madmin.HealResultItem, err error) {
|
func (er erasureObjects) healObject(ctx context.Context, bucket string, object string, versionID string, opts madmin.HealOpts) (result madmin.HealResultItem, err error) {
|
||||||
|
|
||||||
dryRun := opts.DryRun
|
dryRun := opts.DryRun
|
||||||
scanMode := opts.ScanMode
|
scanMode := opts.ScanMode
|
||||||
@ -249,13 +249,14 @@ func (er erasureObjects) healObject(ctx context.Context, bucket string, object s
|
|||||||
DataBlocks: len(storageDisks) - er.defaultParityCount,
|
DataBlocks: len(storageDisks) - er.defaultParityCount,
|
||||||
}
|
}
|
||||||
|
|
||||||
if !opts.NoLock {
|
lk := er.NewNSLock(bucket, object)
|
||||||
lk := er.NewNSLock(bucket, object)
|
if ctx, err = lk.GetLock(ctx, globalOperationTimeout); err != nil {
|
||||||
if ctx, err = lk.GetLock(ctx, globalOperationTimeout); err != nil {
|
return result, err
|
||||||
return result, err
|
|
||||||
}
|
|
||||||
defer lk.Unlock()
|
|
||||||
}
|
}
|
||||||
|
defer lk.Unlock()
|
||||||
|
|
||||||
|
// Re-read when we have lock...
|
||||||
|
partsMetadata, errs := readAllFileInfo(ctx, storageDisks, bucket, object, versionID, true)
|
||||||
|
|
||||||
// List of disks having latest version of the object er.meta
|
// List of disks having latest version of the object er.meta
|
||||||
// (by modtime).
|
// (by modtime).
|
||||||
@ -857,7 +858,7 @@ func (er erasureObjects) HealObject(ctx context.Context, bucket, object, version
|
|||||||
versionID = nullVersionID
|
versionID = nullVersionID
|
||||||
}
|
}
|
||||||
|
|
||||||
partsMetadata, errs := readAllFileInfo(healCtx, storageDisks, bucket, object, versionID, true)
|
partsMetadata, errs := readAllFileInfo(healCtx, storageDisks, bucket, object, versionID, false)
|
||||||
|
|
||||||
if isAllNotFound(errs) {
|
if isAllNotFound(errs) {
|
||||||
err = toObjectErr(errFileNotFound, bucket, object)
|
err = toObjectErr(errFileNotFound, bucket, object)
|
||||||
@ -874,5 +875,5 @@ func (er erasureObjects) HealObject(ctx context.Context, bucket, object, version
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Heal the object.
|
// Heal the object.
|
||||||
return er.healObject(healCtx, bucket, object, versionID, partsMetadata, errs, opts)
|
return er.healObject(healCtx, bucket, object, versionID, opts)
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,6 @@ type HealOpts struct {
|
|||||||
DryRun bool `json:"dryRun"`
|
DryRun bool `json:"dryRun"`
|
||||||
Remove bool `json:"remove"`
|
Remove bool `json:"remove"`
|
||||||
Recreate bool `json:"recreate"` // only used when bucket needs to be healed
|
Recreate bool `json:"recreate"` // only used when bucket needs to be healed
|
||||||
NoLock bool `json:"-"` // only used internally.
|
|
||||||
ScanMode HealScanMode `json:"scanMode"`
|
ScanMode HealScanMode `json:"scanMode"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user