package shard import ( "context" "sync" "testing" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/object" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/internal/testutil" cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test" "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" ) func TestShard_List(t *testing.T) { t.Parallel() t.Run("without write cache", func(t *testing.T) { t.Parallel() sh := newShard(t, false) defer func() { require.NoError(t, sh.Close()) }() testShardList(t, sh) }) t.Run("with write cache", func(t *testing.T) { t.Parallel() shWC := newShard(t, true) defer func() { require.NoError(t, shWC.Close()) }() testShardList(t, shWC) }) } func testShardList(t *testing.T, sh *Shard) { const C = 10 const N = 5 var mtx sync.Mutex objs := make(map[string]int) var errG errgroup.Group errG.SetLimit(C * N) for i := 0; i < C; i++ { errG.Go(func() error { cnr := cidtest.ID() for j := 0; j < N; j++ { errG.Go(func() error { obj := testutil.GenerateObjectWithCID(cnr) testutil.AddPayload(obj, 1<<2) // add parent as virtual object, it must be ignored in List() parent := testutil.GenerateObjectWithCID(cnr) idParent, _ := parent.ID() obj.SetParentID(idParent) obj.SetParent(parent) mtx.Lock() objs[object.AddressOf(obj).EncodeToString()] = 0 mtx.Unlock() var putPrm PutPrm putPrm.SetObject(obj) _, err := sh.Put(context.Background(), putPrm) return err }) } return nil }) } require.NoError(t, errG.Wait()) res, err := sh.List(context.Background()) require.NoError(t, err) for _, objID := range res.AddressList() { i, ok := objs[objID.EncodeToString()] require.True(t, ok) require.Equal(t, 0, i) objs[objID.EncodeToString()] = 1 } }