forked from TrueCloudLab/frostfs-node
[#1085] blobovnicza: allow to ignore errors during iteration
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
9c60ab893c
commit
e53ad2f468
2 changed files with 67 additions and 0 deletions
|
@ -84,6 +84,8 @@ type IteratePrm struct {
|
|||
withoutData bool
|
||||
|
||||
handler IterationHandler
|
||||
|
||||
ignoreErrors bool
|
||||
}
|
||||
|
||||
// DecodeAddresses sets flag to unmarshal object addresses.
|
||||
|
@ -101,6 +103,11 @@ func (x *IteratePrm) SetHandler(h IterationHandler) {
|
|||
x.handler = h
|
||||
}
|
||||
|
||||
// IgnoreErrors makes all errors to be ignored.
|
||||
func (x *IteratePrm) IgnoreErrors() {
|
||||
x.ignoreErrors = true
|
||||
}
|
||||
|
||||
// IterateRes groups resulting values of Iterate operation.
|
||||
type IterateRes struct {
|
||||
}
|
||||
|
@ -124,6 +131,9 @@ func (b *Blobovnicza) Iterate(prm IteratePrm) (*IterateRes, error) {
|
|||
}
|
||||
|
||||
if err := addressFromKey(elem.addr, k); err != nil {
|
||||
if prm.ignoreErrors {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("could not decode address key: %w", err)
|
||||
}
|
||||
}
|
||||
|
|
57
pkg/local_object_storage/blobovnicza/iterate_test.go
Normal file
57
pkg/local_object_storage/blobovnicza/iterate_test.go
Normal file
|
@ -0,0 +1,57 @@
|
|||
package blobovnicza
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/nspcc-dev/neo-go/pkg/util/slice"
|
||||
objecttest "github.com/nspcc-dev/neofs-sdk-go/object/test"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
func TestBlobovniczaIterate(t *testing.T) {
|
||||
filename := filepath.Join(t.TempDir(), "blob")
|
||||
b := New(WithPath(filename))
|
||||
require.NoError(t, b.Open())
|
||||
require.NoError(t, b.Init())
|
||||
|
||||
data := [][]byte{{0, 1, 2, 3}, {5, 6, 7, 8}}
|
||||
addr := objecttest.Address()
|
||||
_, err := b.Put(&PutPrm{addr: addr, objData: data[0]})
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NoError(t, b.boltDB.Update(func(tx *bbolt.Tx) error {
|
||||
buck := tx.Bucket(bucketKeyFromBounds(firstBucketBound))
|
||||
return buck.Put([]byte("invalid address"), data[1])
|
||||
}))
|
||||
|
||||
seen := make([][]byte, 0, 2)
|
||||
inc := func(e IterationElement) error {
|
||||
seen = append(seen, slice.Copy(e.data))
|
||||
return nil
|
||||
}
|
||||
|
||||
_, err = b.Iterate(IteratePrm{handler: inc})
|
||||
require.NoError(t, err)
|
||||
require.ElementsMatch(t, seen, data)
|
||||
|
||||
seen = seen[:0]
|
||||
_, err = b.Iterate(IteratePrm{handler: inc, decodeAddresses: true})
|
||||
require.Error(t, err)
|
||||
|
||||
seen = seen[:0]
|
||||
_, err = b.Iterate(IteratePrm{handler: inc, decodeAddresses: true, ignoreErrors: true})
|
||||
require.NoError(t, err)
|
||||
require.ElementsMatch(t, seen, data[:1])
|
||||
|
||||
seen = seen[:0]
|
||||
expectedErr := errors.New("stop iteration")
|
||||
_, err = b.Iterate(IteratePrm{
|
||||
decodeAddresses: true,
|
||||
handler: func(IterationElement) error { return expectedErr },
|
||||
ignoreErrors: true,
|
||||
})
|
||||
require.True(t, errors.Is(err, expectedErr), "got: %v")
|
||||
}
|
Loading…
Reference in a new issue