forked from TrueCloudLab/frostfs-node
Dmitrii Stepanov
c1667a11d2
Now it is possible to change depth or with of blobovniczatree. Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
189 lines
4.7 KiB
Go
189 lines
4.7 KiB
Go
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())
|
|
}
|