From f5f416268f886244f377c733a79b25e7a1d535f7 Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Fri, 19 Feb 2021 11:19:28 +0300 Subject: [PATCH] [#378] metabase: Add the ability to break the loop in IterateOverGraveyard Make `DB.IterateOverGraveyard` to immediately return nil if GraveHandler returns ErrInterruptIterator. Signed-off-by: Leonard Lyubich --- pkg/local_object_storage/metabase/graveyard.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pkg/local_object_storage/metabase/graveyard.go b/pkg/local_object_storage/metabase/graveyard.go index c67826792..7366f9ed5 100644 --- a/pkg/local_object_storage/metabase/graveyard.go +++ b/pkg/local_object_storage/metabase/graveyard.go @@ -30,7 +30,8 @@ type GraveHandler func(*Grave) error // IterateOverGraveyard iterates over all graves in DB. // -// Returns errors of h directly. +// If h returns ErrInterruptIterator, nil returns immediately. +// Returns other errors of h directly. func (db *DB) IterateOverGraveyard(h GraveHandler) error { return db.boltDB.View(func(tx *bbolt.Tx) error { return db.iterateOverGraveyard(tx, h) @@ -45,7 +46,7 @@ func (db *DB) iterateOverGraveyard(tx *bbolt.Tx, h GraveHandler) error { } // iterate over all graves - return bktGraveyard.ForEach(func(k, v []byte) error { + err := bktGraveyard.ForEach(func(k, v []byte) error { // parse Grave g, err := graveFromKV(k, v) if err != nil { @@ -55,6 +56,12 @@ func (db *DB) iterateOverGraveyard(tx *bbolt.Tx, h GraveHandler) error { // handler Grave return h(g) }) + + if errors.Is(err, ErrInterruptIterator) { + err = nil + } + + return err } func graveFromKV(k, v []byte) (*Grave, error) {