From 7778fef6bb26d0a44fd0689484c8a1bcc295603c Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Wed, 26 Aug 2020 08:53:33 -0700 Subject: [PATCH] update continous heal metrics appropriately for scanned items (#10352) bonus make sure to ignore objectNotFound, and versionNotFound errors properly at all layers, since HealObjects() returns objectNotFound error if the bucket or prefix is empty. --- cmd/admin-heal-ops.go | 27 +++++++++++++++++---------- cmd/background-heal-ops.go | 1 + cmd/global-heal.go | 2 +- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/cmd/admin-heal-ops.go b/cmd/admin-heal-ops.go index f7835a6a5..923f592fa 100644 --- a/cmd/admin-heal-ops.go +++ b/cmd/admin-heal-ops.go @@ -647,6 +647,12 @@ func (h *healSequence) queueHealTask(source healSource, healType madmin.HealItem if source.opts != nil { task.opts = *source.opts } + + h.mutex.Lock() + h.scannedItemsMap[healType]++ + h.lastHealActivity = UTCNow() + h.mutex.Unlock() + globalBackgroundHealRoutine.queueHealTask(task) select { @@ -729,9 +735,6 @@ func (h *healSequence) healItemsFromSourceCh() error { pathJoin(source.bucket, source.object), err)) } } - - h.scannedItemsMap[itemType]++ - h.lastHealActivity = UTCNow() case <-h.ctx.Done(): return nil } @@ -868,7 +871,9 @@ func (h *healSequence) healBucket(bucket string, bucketsOnly bool) error { } if err := h.queueHealTask(healSource{bucket: bucket}, madmin.HealItemBucket); err != nil { - return err + if !isErrObjectNotFound(err) && !isErrVersionNotFound(err) { + return err + } } if bucketsOnly { @@ -882,6 +887,9 @@ func (h *healSequence) healBucket(bucket string, bucketsOnly bool) error { oi, err := objectAPI.GetObjectInfo(h.ctx, bucket, h.object, ObjectOptions{}) if err == nil { if err = h.healObject(bucket, h.object, oi.VersionID); err != nil { + if isErrObjectNotFound(err) || isErrVersionNotFound(err) { + return nil + } return err } } @@ -891,7 +899,11 @@ func (h *healSequence) healBucket(bucket string, bucketsOnly bool) error { } if err := objectAPI.HealObjects(h.ctx, bucket, h.object, h.settings, h.healObject); err != nil { - return errFnHealFromAPIErr(h.ctx, err) + // Object might have been deleted, by the time heal + // was attempted we ignore this object an move on. + if !isErrObjectNotFound(err) && !isErrVersionNotFound(err) { + return errFnHealFromAPIErr(h.ctx, err) + } } return nil } @@ -913,10 +925,5 @@ func (h *healSequence) healObject(bucket, object, versionID string) error { object: object, versionID: versionID, }, madmin.HealItemObject) - // Object might have been deleted, by the time heal - // was attempted we ignore this object an move on. - if isErrObjectNotFound(err) || isErrVersionNotFound(err) { - return nil - } return err } diff --git a/cmd/background-heal-ops.go b/cmd/background-heal-ops.go index cbdaa1fe4..c77bfe040 100644 --- a/cmd/background-heal-ops.go +++ b/cmd/background-heal-ops.go @@ -101,6 +101,7 @@ func (h *healRoutine) run(ctx context.Context, objAPI ObjectLayer) { ObjectPathUpdated(path.Join(task.bucket, task.object)) } task.responseCh <- healResult{result: res, err: err} + case <-h.doneCh: return case <-ctx.Done(): diff --git a/cmd/global-heal.go b/cmd/global-heal.go index a68cb6bd5..8144e5fa3 100644 --- a/cmd/global-heal.go +++ b/cmd/global-heal.go @@ -84,7 +84,7 @@ func getLocalBackgroundHealStatus() (madmin.BgHealState, bool) { ScannedItemsCount: bgSeq.getScannedItemsCount(), LastHealActivity: bgSeq.lastHealActivity, HealDisks: healDisks, - NextHealRound: UTCNow().Add(dataCrawlStartDelay), + NextHealRound: UTCNow(), }, true }