Use async healing in PutObject call (#16431)

This commit is contained in:
Anis Elleuch 2023-01-19 09:54:22 +01:00 committed by GitHub
parent 71c95ad0d0
commit d98116559b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 4 deletions

View File

@ -773,7 +773,10 @@ func renameData(ctx context.Context, disks []StorageAPI, srcBucket, srcEntry str
err := reduceWriteQuorumErrs(ctx, errs, objectOpIgnoredErrs, writeQuorum) err := reduceWriteQuorumErrs(ctx, errs, objectOpIgnoredErrs, writeQuorum)
if err == nil { if err == nil {
versions := reduceCommonVersions(diskVersions, writeQuorum) versions := reduceCommonVersions(diskVersions, writeQuorum)
for _, dversions := range diskVersions { for index, dversions := range diskVersions {
if errs[index] != nil {
continue
}
if versions != dversions { if versions != dversions {
versionsDisparity = true versionsDisparity = true
break break
@ -961,7 +964,7 @@ func healObjectVersionsDisparity(bucket string, entry metaCacheEntry) error {
fivs, err := entry.fileInfoVersions(bucket) fivs, err := entry.fileInfoVersions(bucket)
if err != nil { if err != nil {
healObject(bucket, entry.name, "", madmin.HealNormalScan) go healObject(bucket, entry.name, "", madmin.HealNormalScan)
return err return err
} }
@ -971,7 +974,7 @@ func healObjectVersionsDisparity(bucket string, entry metaCacheEntry) error {
} }
for _, version := range fivs.Versions { for _, version := range fivs.Versions {
healObject(bucket, entry.name, version.VersionID, madmin.HealNormalScan) go healObject(bucket, entry.name, version.VersionID, madmin.HealNormalScan)
} }
return nil return nil

View File

@ -437,7 +437,8 @@ func (er *erasureObjects) healErasureSet(ctx context.Context, buckets []string,
return retErr return retErr
} }
// healObject heals given object path in deep to fix bitrot. // healObject sends the given object/version to the background healing workers
// and only returns when healing of the object is done.
func healObject(bucket, object, versionID string, scan madmin.HealScanMode) { func healObject(bucket, object, versionID string, scan madmin.HealScanMode) {
// Get background heal sequence to send elements to heal // Get background heal sequence to send elements to heal
globalHealStateLK.Lock() globalHealStateLK.Lock()