forked from TrueCloudLab/frostfs-node
fe8076e60a
Mark objects with GC immediately after a Tombstone is received. Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
110 lines
2.3 KiB
Go
110 lines
2.3 KiB
Go
package meta_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/core/object"
|
|
meta "github.com/nspcc-dev/neofs-node/pkg/local_object_storage/metabase"
|
|
addressSDK "github.com/nspcc-dev/neofs-sdk-go/object/address"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestDB_IterateDeletedObjects(t *testing.T) {
|
|
db := newDB(t)
|
|
|
|
// generate and put 2 objects
|
|
obj1 := generateObject(t)
|
|
obj2 := generateObject(t)
|
|
obj3 := generateObject(t)
|
|
obj4 := generateObject(t)
|
|
|
|
var err error
|
|
|
|
err = putBig(db, obj1)
|
|
require.NoError(t, err)
|
|
|
|
err = putBig(db, obj2)
|
|
require.NoError(t, err)
|
|
|
|
err = putBig(db, obj3)
|
|
require.NoError(t, err)
|
|
|
|
err = putBig(db, obj4)
|
|
require.NoError(t, err)
|
|
|
|
inhumePrm := new(meta.InhumePrm)
|
|
|
|
// inhume with tombstone
|
|
addrTombstone := generateAddress()
|
|
|
|
_, err = db.Inhume(inhumePrm.
|
|
WithAddresses(object.AddressOf(obj1), object.AddressOf(obj2)).
|
|
WithTombstoneAddress(addrTombstone),
|
|
)
|
|
require.NoError(t, err)
|
|
|
|
// inhume with GC mark
|
|
_, err = db.Inhume(inhumePrm.
|
|
WithAddresses(object.AddressOf(obj3), object.AddressOf(obj4)).
|
|
WithGCMark(),
|
|
)
|
|
|
|
var (
|
|
counterAll int
|
|
buriedTS, buriedGC []*addressSDK.Address
|
|
)
|
|
|
|
err = db.IterateOverGraveyard(func(deletedObject *meta.DeletedObject) error {
|
|
buriedTS = append(buriedTS, deletedObject.Address())
|
|
counterAll++
|
|
|
|
return nil
|
|
})
|
|
|
|
err = db.IterateOverGarbage(func(deletedObject *meta.DeletedObject) error {
|
|
buriedGC = append(buriedGC, deletedObject.Address())
|
|
counterAll++
|
|
|
|
return nil
|
|
})
|
|
|
|
require.NoError(t, err)
|
|
|
|
// objects covered with a tombstone
|
|
// also receive GS mark
|
|
garbageExpected := []*addressSDK.Address{
|
|
object.AddressOf(obj1), object.AddressOf(obj2),
|
|
object.AddressOf(obj3), object.AddressOf(obj4),
|
|
}
|
|
|
|
graveyardExpected := []*addressSDK.Address{
|
|
object.AddressOf(obj1), object.AddressOf(obj2),
|
|
}
|
|
|
|
require.Equal(t, len(garbageExpected)+len(graveyardExpected), counterAll)
|
|
require.True(t, equalAddresses(graveyardExpected, buriedTS))
|
|
require.True(t, equalAddresses(garbageExpected, buriedGC))
|
|
}
|
|
|
|
func equalAddresses(aa1 []*addressSDK.Address, aa2 []*addressSDK.Address) bool {
|
|
if len(aa1) != len(aa2) {
|
|
return false
|
|
}
|
|
|
|
for _, a1 := range aa1 {
|
|
found := false
|
|
|
|
for _, a2 := range aa2 {
|
|
if a1.String() == a2.String() {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|