From 2698dc1296f7cd4fa79d9f11795894e67d97e206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 15 Feb 2022 13:13:33 +0000 Subject: [PATCH] start using correct node path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- pkg/storage/utils/decomposedfs/lookup.go | 34 ++++++++++----------- pkg/storage/utils/decomposedfs/tree/tree.go | 7 +++-- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/pkg/storage/utils/decomposedfs/lookup.go b/pkg/storage/utils/decomposedfs/lookup.go index 84e79095f23..2c810d19a4a 100644 --- a/pkg/storage/utils/decomposedfs/lookup.go +++ b/pkg/storage/utils/decomposedfs/lookup.go @@ -21,7 +21,6 @@ package decomposedfs import ( "context" "fmt" - "os" "path/filepath" "strings" @@ -93,24 +92,23 @@ func (lu *Lookup) NodeFromID(ctx context.Context, id *provider.ResourceId) (n *n return n, n.FindStorageSpaceRoot() } -// NodeFromSpaceID converts a resource id without an opaque id into a Node -func (lu *Lookup) NodeFromSpaceID(ctx context.Context, id *provider.ResourceId) (n *node.Node, err error) { - d := filepath.Join(lu.Options.Root, "spaces", spaceTypeAny, id.StorageId) - matches, err := filepath.Glob(d) - if err != nil { - return nil, err - } - - if len(matches) != 1 { - return nil, fmt.Errorf("can't determine node from spaceID: found %d matching spaces. Path: %s", len(matches), d) - } - - target, err := os.Readlink(matches[0]) - if err != nil { - appctx.GetLogger(ctx).Error().Err(err).Str("match", matches[0]).Msg("could not read link, skipping") +func Pathify(id string, depth, width int) string { + b := strings.Builder{} + i := 0 + for ; i < depth; i++ { + if len(id) <= i*width+width { + break + } + b.WriteString(id[i*width : i*width+width]) + b.WriteRune(filepath.Separator) } + b.WriteString(id[i*width:]) + return b.String() +} - node, err := node.ReadNode(ctx, lu, id.StorageId, filepath.Base(target)) +// NodeFromSpaceID converts a resource id without an opaque id into a Node +func (lu *Lookup) NodeFromSpaceID(ctx context.Context, id *provider.ResourceId) (n *node.Node, err error) { + node, err := node.ReadNode(ctx, lu, id.StorageId, id.StorageId) if err != nil { return nil, err } @@ -192,7 +190,7 @@ func (lu *Lookup) InternalRoot() string { // InternalPath returns the internal path for a given ID func (lu *Lookup) InternalPath(spaceID, nodeID string) string { - return filepath.Join(lu.Options.Root, "nodes", spaceID, nodeID) + return filepath.Join(lu.Options.Root, "spaces", Pathify(spaceID, 1, 2), "nodes", Pathify(nodeID, 4, 2)) } func (lu *Lookup) mustGetUserLayout(ctx context.Context) string { diff --git a/pkg/storage/utils/decomposedfs/tree/tree.go b/pkg/storage/utils/decomposedfs/tree/tree.go index 2fdf027f14c..4660130154c 100644 --- a/pkg/storage/utils/decomposedfs/tree/tree.go +++ b/pkg/storage/utils/decomposedfs/tree/tree.go @@ -96,11 +96,12 @@ func New(root string, tta bool, tsa bool, lu PathLookup, bs Blobstore) *Tree { func (t *Tree) Setup(owner *userpb.UserId, propagateToRoot bool) error { // create data paths for internal layout dataPaths := []string{ - filepath.Join(t.root, "nodes"), + filepath.Join(t.root, "spaces"), + //filepath.Join(t.root, "nodes"), // notes contain symlinks from nodes//uploads/ to ../../uploads/ // better to keep uploads on a fast / volatile storage before a workflow finally moves them to the nodes dir - filepath.Join(t.root, "uploads"), - filepath.Join(t.root, "trash"), + //filepath.Join(t.root, "uploads"), + //filepath.Join(t.root, "trash"), } for _, v := range dataPaths { err := os.MkdirAll(v, 0700)