From 2aa5ac68046d417aa2c4f92f94503ccb8918d08c Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Wed, 26 Aug 2020 13:17:48 -0400 Subject: [PATCH 1/2] ResolveToLastNode no longer fetches nodes it does not need This commit was moved from ipfs/go-path@ac811c4b484b06ea22da1071890e94fb4b7ab9be --- path/resolver/resolver.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 67bb9f6fb..9f153840c 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -89,6 +89,10 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid. return cid.Cid{}, nil, err } + if len(rest) == 0 { + return lnk.Cid, nil, nil + } + next, err := lnk.GetNode(ctx, r.DAG) if err != nil { return cid.Cid{}, nil, err From 35e8ffb3dc5c79e7d56367ce8d74bbaa83200aba Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Wed, 26 Aug 2020 13:59:39 -0400 Subject: [PATCH 2/2] test: add test that ResolveToLastNode does not perform unncessary fetches This commit was moved from ipfs/go-path@6d87ec04ebe94d4c105b78fe64471ebdb2a26b70 --- path/resolver/resolver_test.go | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index 480ccdf1d..d3c6913e7 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -105,3 +105,43 @@ func TestRecurivePathResolution(t *testing.T) { p.String(), rCid.String(), cKey.String())) } } + +func TestResolveToLastNode_NoUnnecessaryFetching(t *testing.T) { + ctx := context.Background() + dagService := dagmock.Mock() + + a := randNode() + b := randNode() + + err := a.AddNodeLink("child", b) + if err != nil { + t.Fatal(err) + } + + err = dagService.Add(ctx, a) + if err != nil { + t.Fatal(err) + } + + aKey := a.Cid() + + segments := []string{aKey.String(), "child"} + p, err := path.FromSegments("/ipfs/", segments...) + if err != nil { + t.Fatal(err) + } + + resolver := resolver.NewBasicResolver(dagService) + resolvedCID, remainingPath, err := resolver.ResolveToLastNode(ctx, p) + if err != nil { + t.Fatal(err) + } + + if len(remainingPath) > 0 { + t.Fatal("cannot have remaining path") + } + + if !resolvedCID.Equals(b.Cid()) { + t.Fatal("resolved to the wrong CID") + } +}