forked from TrueCloudLab/frostfs-node
[#1324] local_object_storage: Implement tree service backend
In this commit we implement algorithm for CRDT trees from https://martin.klepmann.com/papers/move-op.pdf Each tree is identified by the ID of a container it belongs to and the tree name itself. Essentially, it is a sequence of operations which should be applied in chronological order to get a usual tree representation. There are 2 backends for now: bbolt database and in-memory. In-memory backend is here for debugging and will eventually act as a memory-cache for the on-disk database. Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
198beae703
commit
8cf71b7f1c
8 changed files with 1499 additions and 0 deletions
54
pkg/local_object_storage/pilorama/meta_test.go
Normal file
54
pkg/local_object_storage/pilorama/meta_test.go
Normal file
|
@ -0,0 +1,54 @@
|
|||
package pilorama
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestMeta_Bytes(t *testing.T) {
|
||||
t.Run("empty", func(t *testing.T) {
|
||||
var m Meta
|
||||
require.NoError(t, m.FromBytes(nil))
|
||||
require.True(t, len(m.Items) == 0)
|
||||
require.Equal(t, uint64(0), m.Time)
|
||||
require.Equal(t, []byte{0, 0}, m.Bytes())
|
||||
})
|
||||
t.Run("filled", func(t *testing.T) {
|
||||
expected := Meta{
|
||||
Time: 123,
|
||||
Items: []KeyValue{
|
||||
{"abc", []byte{1, 2, 3}},
|
||||
{"xyz", []byte{5, 6, 7, 8}},
|
||||
}}
|
||||
|
||||
data := expected.Bytes()
|
||||
|
||||
var actual Meta
|
||||
require.NoError(t, actual.FromBytes(data))
|
||||
require.Equal(t, expected, actual)
|
||||
|
||||
t.Run("error", func(t *testing.T) {
|
||||
require.Error(t, new(Meta).FromBytes(data[:len(data)/2]))
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestMeta_GetAttr(t *testing.T) {
|
||||
attr := [][]byte{
|
||||
make([]byte, 5),
|
||||
make([]byte, 10),
|
||||
}
|
||||
for i := range attr {
|
||||
rand.Read(attr[i])
|
||||
}
|
||||
|
||||
m := Meta{Items: []KeyValue{{"abc", attr[0]}, {"xyz", attr[1]}}}
|
||||
require.Equal(t, attr[0], m.GetAttr("abc"))
|
||||
require.Equal(t, attr[1], m.GetAttr("xyz"))
|
||||
|
||||
require.Nil(t, m.GetAttr("a"))
|
||||
require.Nil(t, m.GetAttr("xyza"))
|
||||
require.Nil(t, m.GetAttr(""))
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue