From 772deca3e96c73f171962e9470c35923a6074701 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 21 Jul 2018 14:58:16 +0200 Subject: [PATCH 1/5] Fix resolving links in sharded directories on gateway MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera --- path/resolver/resolver.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 05341655a..2aa247645 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -69,19 +69,25 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld } for len(p) > 0 { - val, rest, err := nd.Resolve(p) + lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p) if err != nil { return nil, nil, err } - switch val := val.(type) { - case *ipld.Link: - next, err := val.GetNode(ctx, r.DAG) + if lnk != nil { + next, err := lnk.GetNode(ctx, r.DAG) if err != nil { return nil, nil, err } nd = next p = rest + continue + } + + val, rest, err := nd.Resolve(p) + switch val.(type) { + case *ipld.Link: + return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") default: return nd, p, nil } From a11c5d27e1981f1d36b000a5fa0897c31e18cd47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 21 Jul 2018 15:15:40 +0200 Subject: [PATCH 2/5] path: gateway test for sharded dirs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera --- test/sharness/t0260-sharding.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/sharness/t0260-sharding.sh b/test/sharness/t0260-sharding.sh index 63f797aba..01fc447f4 100755 --- a/test/sharness/t0260-sharding.sh +++ b/test/sharness/t0260-sharding.sh @@ -76,6 +76,15 @@ test_expect_success "'ipfs ls --resolve-type=false' admits missing block" ' test_cmp sharded_out missing_out ' +test_launch_ipfs_daemon + +test_expect_success "gateway can resolve sharded dirs" ' + echo 100 > expected && + curl -sfo actual "http://127.0.0.1:$GWAY_PORT/ipfs/$SHARDED/file100" && + test_cmp expected actual +' + +test_kill_ipfs_daemon test_add_large_dir_v1() { exphash="$1" From 492a4fc46bacd2c34d55740bb140d8d076e4533d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 21 Jul 2018 17:29:18 +0200 Subject: [PATCH 3/5] path: fix dag tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera --- path/resolver/resolver.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 2aa247645..e7a95a83e 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -70,11 +70,11 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld for len(p) > 0 { lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p) - if err != nil { - return nil, nil, err - } - if lnk != nil { + if err != nil { + return nil, nil, err + } + next, err := lnk.GetNode(ctx, r.DAG) if err != nil { return nil, nil, err @@ -85,6 +85,9 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld } val, rest, err := nd.Resolve(p) + if err != nil { + return nil, nil, err + } switch val.(type) { case *ipld.Link: return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") From de6a6e3e44eff6aa61ccf1586b3926929f16c794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 23 Jul 2018 17:37:33 +0200 Subject: [PATCH 4/5] path: simplify ResolveToLastNode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera --- path/resolver/resolver.go | 46 +++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index e7a95a83e..7bd8caff9 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -70,33 +70,41 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld for len(p) > 0 { lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p) - if lnk != nil { - if err != nil { - return nil, nil, err - } - - next, err := lnk.GetNode(ctx, r.DAG) - if err != nil { - return nil, nil, err - } - nd = next - p = rest - continue + if lnk == nil { + break } - val, rest, err := nd.Resolve(p) if err != nil { return nil, nil, err } - switch val.(type) { - case *ipld.Link: - return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") - default: - return nd, p, nil + + next, err := lnk.GetNode(ctx, r.DAG) + if err != nil { + return nil, nil, err } + nd = next + p = rest } - return nd, nil, nil + if len(p) == 0 { + return nd, nil, nil + } + + // Confirm the path exists within the object + val, rest, err := nd.Resolve(p) + if err != nil { + return nil, nil, err + } + + if len(rest) > 0 { + return nil, nil, errors.New("path failed to resolve fully") + } + switch val.(type) { + case *ipld.Link: + return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") + default: + return nd, p, nil + } } // ResolvePath fetches the node for given path. It returns the last item From d493624476ba14328b6a6c71758150e384933a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 23 Jul 2018 21:29:09 +0200 Subject: [PATCH 5/5] path: add a comment on dropping error in ResolveToLastNode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera --- path/resolver/resolver.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 7bd8caff9..af6b8628c 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -70,6 +70,10 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld for len(p) > 0 { lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p) + + // Note: have to drop the error here as `ResolveOnce` doesn't handle 'leaf' + // paths (so e.g. for `echo '{"foo":123}' | ipfs dag put` we wouldn't be + // able to resolve `zdpu[...]/foo`) if lnk == nil { break }