[#1318] metabase: Separate buckets with TS and GC marks

It allows storing information about object in both ways at the same time:
1. Metabase should know if an object is covered by a tombstone (that is
not expired yet);
2. It should be possible to physically delete objects covered by a
tombstone immediately (mark with GC) but keep tombstone knowledge.

Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
This commit is contained in:
Pavel Karpy 2021-04-08 17:19:31 +03:00 committed by LeL
parent b74fb2b932
commit 8107c8d1a9
9 changed files with 163 additions and 84 deletions

View file

@ -6,6 +6,7 @@ import (
"github.com/nspcc-dev/neofs-node/pkg/core/object"
meta "github.com/nspcc-dev/neofs-node/pkg/local_object_storage/metabase"
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
objectSDK "github.com/nspcc-dev/neofs-sdk-go/object"
"github.com/stretchr/testify/require"
@ -45,9 +46,6 @@ func TestDB_Delete(t *testing.T) {
err = meta.Inhume(db, object.AddressOf(child), object.AddressOf(ts))
require.NoError(t, err)
err = meta.Inhume(db, object.AddressOf(child), object.AddressOf(ts))
require.NoError(t, err)
// delete object
err = meta.Delete(db, object.AddressOf(child))
require.NoError(t, err)
@ -57,13 +55,14 @@ func TestDB_Delete(t *testing.T) {
require.NoError(t, err)
require.Len(t, l, 0)
// check if they removed from graveyard
// check if they marked as already removed
ok, err := meta.Exists(db, object.AddressOf(child))
require.NoError(t, err)
require.Error(t, apistatus.ObjectAlreadyRemoved{})
require.False(t, ok)
ok, err = meta.Exists(db, object.AddressOf(parent))
require.NoError(t, err)
require.Error(t, apistatus.ObjectAlreadyRemoved{})
require.False(t, ok)
}