forked from TrueCloudLab/frostfs-s3-gw
[#165] Support streaming listing
Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
parent
84af85ed67
commit
29ac91dfd5
12 changed files with 938 additions and 39 deletions
|
@ -3,6 +3,7 @@ package tree
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
|
@ -146,6 +147,7 @@ func (t *memoryTree) createPathIfNotExist(parent *treeNodeMemory, path []string)
|
|||
}
|
||||
t.idCounter++
|
||||
parent.children = append(parent.children, node)
|
||||
//sortNodes(parent.children)
|
||||
}
|
||||
|
||||
return t.createPathIfNotExist(node, path[1:])
|
||||
|
@ -227,9 +229,45 @@ func (c *ServiceClientMemory) GetSubTree(_ context.Context, bktInfo *data.Bucket
|
|||
return nil, ErrNodeNotFound
|
||||
}
|
||||
|
||||
// we depth-1 in case of uint32 and 0 as mark to get all subtree leads to overflow and depth is getting quite big to walk all tree levels
|
||||
return node.listNodes(nil, depth-1), nil
|
||||
}
|
||||
|
||||
type SubTreeStreamImpl struct {
|
||||
res []NodeResponse
|
||||
offset int
|
||||
}
|
||||
|
||||
func (s *SubTreeStreamImpl) Next() (NodeResponse, error) {
|
||||
if s.offset > len(s.res)-1 {
|
||||
return nil, io.EOF
|
||||
}
|
||||
s.offset++
|
||||
return s.res[s.offset-1], nil
|
||||
}
|
||||
|
||||
func (c *ServiceClientMemory) GetSubTreeStream(_ context.Context, bktInfo *data.BucketInfo, treeID string, rootID uint64, depth uint32) (SubTreeStream, error) {
|
||||
cnr, ok := c.containers[bktInfo.CID.EncodeToString()]
|
||||
if !ok {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
tr, ok := cnr.trees[treeID]
|
||||
if !ok {
|
||||
return nil, ErrNodeNotFound
|
||||
}
|
||||
|
||||
node := tr.treeData.getNode(rootID)
|
||||
if node == nil {
|
||||
return nil, ErrNodeNotFound
|
||||
}
|
||||
|
||||
return &SubTreeStreamImpl{
|
||||
res: node.listNodes(nil, depth-1),
|
||||
offset: 0,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func newContainerInfo(bktInfo *data.BucketInfo, treeID string) containerInfo {
|
||||
return containerInfo{
|
||||
bkt: bktInfo,
|
||||
|
@ -257,7 +295,11 @@ func newMemoryTree() memoryTree {
|
|||
}
|
||||
}
|
||||
|
||||
func (c *ServiceClientMemory) AddNode(_ context.Context, bktInfo *data.BucketInfo, treeID string, parent uint64, meta map[string]string) (uint64, error) {
|
||||
func (c *ServiceClientMemory) AddNode(ctx context.Context, bktInfo *data.BucketInfo, treeID string, parent uint64, meta map[string]string) (uint64, error) {
|
||||
return c.AddNodeBase(ctx, bktInfo, treeID, parent, meta, true)
|
||||
}
|
||||
|
||||
func (c *ServiceClientMemory) AddNodeBase(_ context.Context, bktInfo *data.BucketInfo, treeID string, parent uint64, meta map[string]string, needSort bool) (uint64, error) {
|
||||
cnr, ok := c.containers[bktInfo.CID.EncodeToString()]
|
||||
if !ok {
|
||||
cnr = newContainerInfo(bktInfo, treeID)
|
||||
|
@ -289,6 +331,9 @@ func (c *ServiceClientMemory) AddNode(_ context.Context, bktInfo *data.BucketInf
|
|||
}
|
||||
|
||||
parentNode.children = append(parentNode.children, tn)
|
||||
if needSort {
|
||||
//sortNodes(parentNode.children)
|
||||
}
|
||||
cnr.trees[treeID] = tr
|
||||
|
||||
return newID, nil
|
||||
|
@ -326,6 +371,7 @@ func (c *ServiceClientMemory) AddNodeByPath(_ context.Context, bktInfo *data.Buc
|
|||
}
|
||||
|
||||
parentNode.children = append(parentNode.children, tn)
|
||||
//sortNodes(parentNode.children)
|
||||
cnr.trees[treeID] = tr
|
||||
|
||||
return newID, nil
|
||||
|
@ -356,11 +402,38 @@ func (c *ServiceClientMemory) MoveNode(_ context.Context, bktInfo *data.BucketIn
|
|||
node.data.parentID = parentID
|
||||
|
||||
newParent.children = append(newParent.children, node)
|
||||
//sortNodes(newParent.children)
|
||||
node.parent.removeChild(nodeID)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *ServiceClientMemory) Sort() {
|
||||
for _, info := range c.containers {
|
||||
for _, tree := range info.trees {
|
||||
sortNode(tree.treeData)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func sortNode(node *treeNodeMemory) {
|
||||
if node == nil {
|
||||
return
|
||||
}
|
||||
|
||||
sortNodes(node.children)
|
||||
|
||||
for _, child := range node.children {
|
||||
sortNode(child)
|
||||
}
|
||||
}
|
||||
|
||||
func sortNodes(list []*treeNodeMemory) {
|
||||
sort.Slice(list, func(i, j int) bool {
|
||||
return list[i].data.getValue(FileNameKey) < list[j].data.getValue(FileNameKey)
|
||||
})
|
||||
}
|
||||
|
||||
func (c *ServiceClientMemory) RemoveNode(_ context.Context, bktInfo *data.BucketInfo, treeID string, nodeID uint64) error {
|
||||
cnr, ok := c.containers[bktInfo.CID.EncodeToString()]
|
||||
if !ok {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue