[#1251] pilorama: Allow traversing multiple branches in parallel
Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
This commit is contained in:
parent
e5767c9002
commit
3940bc17c1
18 changed files with 571 additions and 328 deletions
|
@ -48,7 +48,7 @@ func TestGetSubTree(t *testing.T) {
|
|||
acc := subTreeAcc{errIndex: errIndex}
|
||||
err := getSubTree(context.Background(), &acc, d.CID, &GetSubTreeRequest_Body{
|
||||
TreeId: treeID,
|
||||
RootId: rootID,
|
||||
RootId: []uint64{rootID},
|
||||
Depth: depth,
|
||||
}, p)
|
||||
if errIndex == -1 {
|
||||
|
@ -58,12 +58,12 @@ func TestGetSubTree(t *testing.T) {
|
|||
}
|
||||
|
||||
// GetSubTree must return child only after is has returned the parent.
|
||||
require.Equal(t, rootID, acc.seen[0].Body.NodeId)
|
||||
require.Equal(t, rootID, acc.seen[0].Body.NodeId[0])
|
||||
loop:
|
||||
for i := 1; i < len(acc.seen); i++ {
|
||||
parent := acc.seen[i].Body.ParentId
|
||||
for j := 0; j < i; j++ {
|
||||
if acc.seen[j].Body.NodeId == parent {
|
||||
if acc.seen[j].Body.NodeId[0] == parent[0] {
|
||||
continue loop
|
||||
}
|
||||
}
|
||||
|
@ -73,16 +73,16 @@ func TestGetSubTree(t *testing.T) {
|
|||
// GetSubTree must return valid meta.
|
||||
for i := range acc.seen {
|
||||
b := acc.seen[i].Body
|
||||
meta, node, err := p.TreeGetMeta(context.Background(), d.CID, treeID, b.NodeId)
|
||||
meta, node, err := p.TreeGetMeta(context.Background(), d.CID, treeID, b.NodeId[0])
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, node, b.ParentId)
|
||||
require.Equal(t, meta.Time, b.Timestamp)
|
||||
require.Equal(t, node, b.ParentId[0])
|
||||
require.Equal(t, meta.Time, b.Timestamp[0])
|
||||
require.Equal(t, metaToProto(meta.Items), b.Meta)
|
||||
}
|
||||
|
||||
ordered := make([]uint64, len(acc.seen))
|
||||
for i := range acc.seen {
|
||||
ordered[i] = acc.seen[i].Body.NodeId
|
||||
ordered[i] = acc.seen[i].Body.NodeId[0]
|
||||
}
|
||||
return ordered
|
||||
}
|
||||
|
@ -184,7 +184,7 @@ func testGetSubTreeOrderAsc(t *testing.T, p pilorama.ForestStorage) {
|
|||
}
|
||||
found := false
|
||||
for j := range tree {
|
||||
if acc.seen[i].Body.NodeId == tree[j].id {
|
||||
if acc.seen[i].Body.NodeId[0] == tree[j].id {
|
||||
found = true
|
||||
paths = append(paths, path.Join(tree[j].path...))
|
||||
}
|
||||
|
@ -205,7 +205,7 @@ func testGetSubTreeOrderAsc(t *testing.T, p pilorama.ForestStorage) {
|
|||
}, p)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, acc.seen, 1)
|
||||
require.Equal(t, uint64(0), acc.seen[0].Body.NodeId)
|
||||
require.Equal(t, uint64(0), acc.seen[0].Body.NodeId[0])
|
||||
})
|
||||
t.Run("depth=2", func(t *testing.T) {
|
||||
acc := subTreeAcc{errIndex: -1}
|
||||
|
@ -218,15 +218,16 @@ func testGetSubTreeOrderAsc(t *testing.T, p pilorama.ForestStorage) {
|
|||
}, p)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, acc.seen, 3)
|
||||
require.Equal(t, uint64(0), acc.seen[0].Body.NodeId)
|
||||
require.Equal(t, uint64(0), acc.seen[1].GetBody().GetParentId())
|
||||
require.Equal(t, uint64(0), acc.seen[2].GetBody().GetParentId())
|
||||
require.Equal(t, uint64(0), acc.seen[0].Body.NodeId[0])
|
||||
require.Equal(t, uint64(0), acc.seen[1].GetBody().GetParentId()[0])
|
||||
require.Equal(t, uint64(0), acc.seen[2].GetBody().GetParentId()[0])
|
||||
})
|
||||
}
|
||||
|
||||
var (
|
||||
errSubTreeSend = errors.New("send finished with error")
|
||||
errSubTreeSendAfterError = errors.New("send was invoked after an error occurred")
|
||||
errInvalidResponse = errors.New("send got invalid response")
|
||||
)
|
||||
|
||||
type subTreeAcc struct {
|
||||
|
@ -239,6 +240,16 @@ type subTreeAcc struct {
|
|||
var _ TreeService_GetSubTreeServer = &subTreeAcc{}
|
||||
|
||||
func (s *subTreeAcc) Send(r *GetSubTreeResponse) error {
|
||||
b := r.GetBody()
|
||||
if len(b.GetNodeId()) > 1 {
|
||||
return errInvalidResponse
|
||||
}
|
||||
if len(b.GetParentId()) > 1 {
|
||||
return errInvalidResponse
|
||||
}
|
||||
if len(b.GetTimestamp()) > 1 {
|
||||
return errInvalidResponse
|
||||
}
|
||||
s.seen = append(s.seen, r)
|
||||
if s.errIndex >= 0 {
|
||||
if len(s.seen) == s.errIndex+1 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue