2022-08-22 14:16:35 +00:00
|
|
|
package blobstortest
|
|
|
|
|
|
|
|
import (
|
2023-04-12 14:01:29 +00:00
|
|
|
"context"
|
2022-08-22 14:16:35 +00:00
|
|
|
"errors"
|
|
|
|
"testing"
|
|
|
|
|
2023-03-07 13:38:26 +00:00
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/common"
|
2022-08-22 14:16:35 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestIterate(t *testing.T, cons Constructor, min, max uint64) {
|
|
|
|
s := cons(t)
|
|
|
|
require.NoError(t, s.Open(false))
|
|
|
|
require.NoError(t, s.Init())
|
|
|
|
t.Cleanup(func() { require.NoError(t, s.Close()) })
|
|
|
|
|
|
|
|
objects := prepare(t, 10, s, min, max)
|
|
|
|
|
|
|
|
// Delete random object to ensure it is not iterated over.
|
|
|
|
const delID = 2
|
|
|
|
var delPrm common.DeletePrm
|
|
|
|
delPrm.Address = objects[2].addr
|
|
|
|
delPrm.StorageID = objects[2].storageID
|
2023-04-12 14:01:29 +00:00
|
|
|
_, err := s.Delete(context.Background(), delPrm)
|
2022-08-22 14:16:35 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
objects = append(objects[:delID], objects[delID+1:]...)
|
|
|
|
|
2023-03-30 10:15:29 +00:00
|
|
|
runTestNormalHandler(t, s, objects)
|
|
|
|
|
|
|
|
runTestIgnoreLogicalErrors(t, s, objects)
|
|
|
|
}
|
|
|
|
|
|
|
|
func runTestNormalHandler(t *testing.T, s common.Storage, objects []objectDesc) {
|
2022-08-22 14:16:35 +00:00
|
|
|
t.Run("normal handler", func(t *testing.T) {
|
|
|
|
seen := make(map[string]objectDesc)
|
|
|
|
|
|
|
|
var iterPrm common.IteratePrm
|
|
|
|
iterPrm.Handler = func(elem common.IterationElement) error {
|
|
|
|
seen[elem.Address.String()] = objectDesc{
|
|
|
|
addr: elem.Address,
|
|
|
|
raw: elem.ObjectData,
|
|
|
|
storageID: elem.StorageID,
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2023-05-24 11:09:11 +00:00
|
|
|
_, err := s.Iterate(context.Background(), iterPrm)
|
2022-08-22 14:16:35 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, len(objects), len(seen))
|
|
|
|
for i := range objects {
|
|
|
|
d, ok := seen[objects[i].addr.String()]
|
|
|
|
require.True(t, ok)
|
|
|
|
require.Equal(t, objects[i].raw, d.raw)
|
|
|
|
require.Equal(t, objects[i].addr, d.addr)
|
|
|
|
require.Equal(t, objects[i].storageID, d.storageID)
|
|
|
|
}
|
|
|
|
})
|
2023-03-30 10:15:29 +00:00
|
|
|
}
|
2022-08-22 14:16:35 +00:00
|
|
|
|
2023-03-30 10:15:29 +00:00
|
|
|
func runTestIgnoreLogicalErrors(t *testing.T, s common.Storage, objects []objectDesc) {
|
2022-08-22 14:16:35 +00:00
|
|
|
t.Run("ignore errors doesn't work for logical errors", func(t *testing.T) {
|
|
|
|
seen := make(map[string]objectDesc)
|
|
|
|
|
|
|
|
var n int
|
2023-10-31 11:56:55 +00:00
|
|
|
logicErr := errors.New("logic error")
|
2022-08-22 14:16:35 +00:00
|
|
|
var iterPrm common.IteratePrm
|
|
|
|
iterPrm.IgnoreErrors = true
|
|
|
|
iterPrm.Handler = func(elem common.IterationElement) error {
|
|
|
|
seen[elem.Address.String()] = objectDesc{
|
|
|
|
addr: elem.Address,
|
|
|
|
raw: elem.ObjectData,
|
|
|
|
storageID: elem.StorageID,
|
|
|
|
}
|
|
|
|
n++
|
|
|
|
if n == len(objects)/2 {
|
|
|
|
return logicErr
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2023-05-24 11:09:11 +00:00
|
|
|
_, err := s.Iterate(context.Background(), iterPrm)
|
2022-08-22 14:16:35 +00:00
|
|
|
require.Equal(t, err, logicErr)
|
|
|
|
require.Equal(t, len(objects)/2, len(seen))
|
|
|
|
for i := range objects {
|
|
|
|
d, ok := seen[objects[i].addr.String()]
|
|
|
|
if ok {
|
|
|
|
n--
|
|
|
|
require.Equal(t, objects[i].raw, d.raw)
|
|
|
|
require.Equal(t, objects[i].addr, d.addr)
|
|
|
|
require.Equal(t, objects[i].storageID, d.storageID)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
require.Equal(t, 0, n)
|
|
|
|
})
|
|
|
|
}
|