package blobovniczatree import ( "context" "os" "path/filepath" "strings" "testing" objectCore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/object" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobovnicza" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/common" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/internal/blobstortest" "github.com/stretchr/testify/require" ) func TestDBExtensionFix(t *testing.T) { root := t.TempDir() createTestTree(t, 0, 2, 3, root) t.Run("adds suffix if not exists", func(t *testing.T) { openAndCloseTestTree(t, 2, 3, root) validateTestTree(t, root) }) t.Run("not adds second suffix if exists", func(t *testing.T) { openAndCloseTestTree(t, 2, 3, root) validateTestTree(t, root) }) } func createTestTree(t *testing.T, currentDepth, depth, width uint64, path string) { if currentDepth == depth { var w uint64 for ; w < width; w++ { dbPath := filepath.Join(path, u64ToHexString(w)) b := blobovnicza.New(blobovnicza.WithPath(dbPath)) require.NoError(t, b.Open()) require.NoError(t, b.Init()) require.NoError(t, b.Close()) } return } var w uint64 for ; w < width; w++ { createTestTree(t, currentDepth+1, depth, width, filepath.Join(path, u64ToHexString(w))) } } func openAndCloseTestTree(t *testing.T, depth, width uint64, path string) { blz := NewBlobovniczaTree( WithBlobovniczaShallowDepth(depth), WithBlobovniczaShallowWidth(width), WithRootPath(path), ) require.NoError(t, blz.Open(false)) require.NoError(t, blz.Init()) require.NoError(t, blz.Close()) } func validateTestTree(t *testing.T, path string) { entries, err := os.ReadDir(path) require.NoError(t, err) for _, entry := range entries { if entry.IsDir() { validateTestTree(t, filepath.Join(path, entry.Name())) } else { require.True(t, strings.HasSuffix(entry.Name(), dbExtension)) require.False(t, strings.HasSuffix(strings.TrimSuffix(entry.Name(), dbExtension), dbExtension)) } } } func TestObjectsAvailableAfterDepthAndWidthEdit(t *testing.T) { t.Parallel() rootDir := t.TempDir() blz := NewBlobovniczaTree( WithBlobovniczaShallowDepth(3), WithBlobovniczaShallowWidth(5), WithRootPath(rootDir), ) require.NoError(t, blz.Open(false)) require.NoError(t, blz.Init()) obj35 := blobstortest.NewObject(10 * 1024) addr35 := objectCore.AddressOf(obj35) raw, err := obj35.Marshal() require.NoError(t, err) pRes35, err := blz.Put(context.Background(), common.PutPrm{ Address: addr35, Object: obj35, RawData: raw, }) require.NoError(t, err) gRes, err := blz.Get(context.Background(), common.GetPrm{ Address: addr35, StorageID: pRes35.StorageID, }) require.NoError(t, err) require.EqualValues(t, obj35, gRes.Object) gRes, err = blz.Get(context.Background(), common.GetPrm{ Address: addr35, }) require.NoError(t, err) require.EqualValues(t, obj35, gRes.Object) require.NoError(t, blz.Close()) // change depth and width blz = NewBlobovniczaTree( WithBlobovniczaShallowDepth(5), WithBlobovniczaShallowWidth(2), WithRootPath(rootDir), ) require.NoError(t, blz.Open(false)) require.NoError(t, blz.Init()) gRes, err = blz.Get(context.Background(), common.GetPrm{ Address: addr35, StorageID: pRes35.StorageID, }) require.NoError(t, err) require.EqualValues(t, obj35, gRes.Object) gRes, err = blz.Get(context.Background(), common.GetPrm{ Address: addr35, }) require.NoError(t, err) require.EqualValues(t, obj35, gRes.Object) obj52 := blobstortest.NewObject(10 * 1024) addr52 := objectCore.AddressOf(obj52) raw, err = obj52.Marshal() require.NoError(t, err) pRes52, err := blz.Put(context.Background(), common.PutPrm{ Address: addr52, Object: obj52, RawData: raw, }) require.NoError(t, err) require.NoError(t, blz.Close()) // change depth and width back blz = NewBlobovniczaTree( WithBlobovniczaShallowDepth(3), WithBlobovniczaShallowWidth(5), WithRootPath(rootDir), ) require.NoError(t, blz.Open(false)) require.NoError(t, blz.Init()) gRes, err = blz.Get(context.Background(), common.GetPrm{ Address: addr35, StorageID: pRes35.StorageID, }) require.NoError(t, err) require.EqualValues(t, obj35, gRes.Object) gRes, err = blz.Get(context.Background(), common.GetPrm{ Address: addr35, }) require.NoError(t, err) require.EqualValues(t, obj35, gRes.Object) gRes, err = blz.Get(context.Background(), common.GetPrm{ Address: addr52, StorageID: pRes52.StorageID, }) require.NoError(t, err) require.EqualValues(t, obj52, gRes.Object) gRes, err = blz.Get(context.Background(), common.GetPrm{ Address: addr52, }) require.NoError(t, err) require.EqualValues(t, obj52, gRes.Object) require.NoError(t, blz.Close()) }