Skip to content

Commit 26f42c4

Browse files
committed
make path resolver no longer require whole node for construction
License: MIT Signed-off-by: Jeromy <[email protected]>
1 parent 6f3ae5d commit 26f42c4

23 files changed

+162
-52
lines changed

core/builder.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ func setupNode(ctx context.Context, n *IpfsNode, cfg *BuildCfg) error {
214214
// this is kinda sketchy and could cause data loss
215215
n.Pinning = pin.NewPinner(n.Repo.Datastore(), n.DAG, internalDag)
216216
}
217-
n.Resolver = &path.Resolver{DAG: n.DAG}
217+
n.Resolver = path.NewBasicResolver(n.DAG)
218218

219219
err = n.loadFilesRoot()
220220
if err != nil {

core/commands/files/files.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
mfs "github.com/ipfs/go-ipfs/mfs"
1717
path "github.com/ipfs/go-ipfs/path"
1818
ft "github.com/ipfs/go-ipfs/unixfs"
19+
uio "github.com/ipfs/go-ipfs/unixfs/io"
1920

2021
logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log"
2122
node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node"
@@ -259,11 +260,15 @@ func getNodeFromPath(ctx context.Context, node *core.IpfsNode, p string) (node.N
259260
return nil, err
260261
}
261262

262-
nd, err := core.Resolve(ctx, node, np)
263+
resolver := &path.Resolver{
264+
DAG: node.DAG,
265+
ResolveOnce: uio.ResolveUnixfsOnce,
266+
}
267+
268+
nd, err := core.Resolve(ctx, node.Namesys, resolver, np)
263269
if err != nil {
264270
return nil, err
265271
}
266-
267272
pbnd, ok := nd.(*dag.ProtoNode)
268273
if !ok {
269274
return nil, dag.ErrNotProtobuf

core/commands/get.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ may also specify the level of compression by specifying '-l=<1-9>'.
6464
}
6565
p := path.Path(req.Arguments()[0])
6666
ctx := req.Context()
67-
dn, err := core.Resolve(ctx, node, p)
67+
dn, err := core.Resolve(ctx, node.Namesys, node.Resolver, p)
6868
if err != nil {
6969
res.SetError(err, cmds.ErrNormal)
7070
return

core/commands/ls.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
merkledag "github.com/ipfs/go-ipfs/merkledag"
1212
path "github.com/ipfs/go-ipfs/path"
1313
unixfs "github.com/ipfs/go-ipfs/unixfs"
14+
uio "github.com/ipfs/go-ipfs/unixfs/io"
1415
unixfspb "github.com/ipfs/go-ipfs/unixfs/pb"
1516

1617
node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node"
@@ -74,7 +75,18 @@ The JSON output contains type information.
7475

7576
var dagnodes []node.Node
7677
for _, fpath := range paths {
77-
dagnode, err := core.Resolve(req.Context(), nd, path.Path(fpath))
78+
p, err := path.ParsePath(fpath)
79+
if err != nil {
80+
res.SetError(err, cmds.ErrNormal)
81+
return
82+
}
83+
84+
r := &path.Resolver{
85+
DAG: nd.DAG,
86+
ResolveOnce: uio.ResolveUnixfsOnce,
87+
}
88+
89+
dagnode, err := core.Resolve(req.Context(), nd.Namesys, r, p)
7890
if err != nil {
7991
res.SetError(err, cmds.ErrNormal)
8092
return

core/commands/object/diff.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ Example:
7474

7575
ctx := req.Context()
7676

77-
obj_a, err := core.Resolve(ctx, node, pa)
77+
obj_a, err := core.Resolve(ctx, node.Namesys, node.Resolver, pa)
7878
if err != nil {
7979
res.SetError(err, cmds.ErrNormal)
8080
return
8181
}
8282

83-
obj_b, err := core.Resolve(ctx, node, pb)
83+
obj_b, err := core.Resolve(ctx, node.Namesys, node.Resolver, pb)
8484
if err != nil {
8585
res.SetError(err, cmds.ErrNormal)
8686
return

core/commands/object/object.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ is the raw data of the object.
9494
return
9595
}
9696

97-
node, err := core.Resolve(req.Context(), n, fpath)
97+
node, err := core.Resolve(req.Context(), n.Namesys, n.Resolver, fpath)
9898
if err != nil {
9999
res.SetError(err, cmds.ErrNormal)
100100
return
@@ -140,7 +140,7 @@ multihash.
140140
}
141141

142142
fpath := path.Path(req.Arguments()[0])
143-
node, err := core.Resolve(req.Context(), n, fpath)
143+
node, err := core.Resolve(req.Context(), n.Namesys, n.Resolver, fpath)
144144
if err != nil {
145145
res.SetError(err, cmds.ErrNormal)
146146
return
@@ -204,7 +204,7 @@ This command outputs data in the following encodings:
204204

205205
fpath := path.Path(req.Arguments()[0])
206206

207-
object, err := core.Resolve(req.Context(), n, fpath)
207+
object, err := core.Resolve(req.Context(), n.Namesys, n.Resolver, fpath)
208208
if err != nil {
209209
res.SetError(err, cmds.ErrNormal)
210210
return
@@ -277,7 +277,7 @@ var ObjectStatCmd = &cmds.Command{
277277

278278
fpath := path.Path(req.Arguments()[0])
279279

280-
object, err := core.Resolve(req.Context(), n, fpath)
280+
object, err := core.Resolve(req.Context(), n.Namesys, n.Resolver, fpath)
281281
if err != nil {
282282
res.SetError(err, cmds.ErrNormal)
283283
return

core/commands/object/patch.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ the limit will not be respected by the network.
7373
return
7474
}
7575

76-
rootnd, err := core.Resolve(req.Context(), nd, root)
76+
rootnd, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, root)
7777
if err != nil {
7878
res.SetError(err, cmds.ErrNormal)
7979
return
@@ -141,7 +141,7 @@ Example:
141141
return
142142
}
143143

144-
root, err := core.Resolve(req.Context(), nd, rp)
144+
root, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, rp)
145145
if err != nil {
146146
res.SetError(err, cmds.ErrNormal)
147147
return
@@ -205,7 +205,7 @@ Removes a link by the given name from root.
205205
return
206206
}
207207

208-
root, err := core.Resolve(req.Context(), nd, rootp)
208+
root, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, rootp)
209209
if err != nil {
210210
res.SetError(err, cmds.ErrNormal)
211211
return
@@ -280,7 +280,7 @@ to a file containing 'bar', and returns the hash of the new object.
280280
return
281281
}
282282

283-
root, err := core.Resolve(req.Context(), nd, rootp)
283+
root, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, rootp)
284284
if err != nil {
285285
res.SetError(err, cmds.ErrNormal)
286286
return
@@ -312,7 +312,7 @@ to a file containing 'bar', and returns the hash of the new object.
312312

313313
e := dagutils.NewDagEditor(rtpb, nd.DAG)
314314

315-
childnd, err := core.Resolve(req.Context(), nd, childp)
315+
childnd, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, childp)
316316
if err != nil {
317317
res.SetError(err, cmds.ErrNormal)
318318
return

core/commands/pin.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ func pinLsKeys(args []string, typeStr string, ctx context.Context, n *core.IpfsN
277277
return nil, err
278278
}
279279

280-
dagNode, err := core.Resolve(ctx, n, pth)
280+
dagNode, err := core.Resolve(ctx, n.Namesys, n.Resolver, pth)
281281
if err != nil {
282282
return nil, err
283283
}

core/commands/publish.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func publish(ctx context.Context, n *core.IpfsNode, k crypto.PrivKey, ref path.P
135135

136136
if opts.verifyExists {
137137
// verify the path exists
138-
_, err := core.Resolve(ctx, n, ref)
138+
_, err := core.Resolve(ctx, n.Namesys, n.Resolver, ref)
139139
if err != nil {
140140
return nil, err
141141
}

core/commands/refs.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,13 @@ var refsMarshallerMap = cmds.MarshalerMap{
198198

199199
func objectsForPaths(ctx context.Context, n *core.IpfsNode, paths []string) ([]node.Node, error) {
200200
objects := make([]node.Node, len(paths))
201-
for i, p := range paths {
202-
o, err := core.Resolve(ctx, n, path.Path(p))
201+
for i, sp := range paths {
202+
p, err := path.ParsePath(sp)
203+
if err != nil {
204+
return nil, err
205+
}
206+
207+
o, err := core.Resolve(ctx, n.Namesys, n.Resolver, p)
203208
if err != nil {
204209
return nil, err
205210
}

core/commands/resolve.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ Resolve the value of an IPFS DAG path:
9999
return
100100
}
101101

102-
node, err := core.Resolve(req.Context(), n, p)
102+
node, err := core.Resolve(req.Context(), n.Namesys, n.Resolver, p)
103103
if err != nil {
104104
res.SetError(err, cmds.ErrNormal)
105105
return

core/commands/tar.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ var tarCatCmd = &cmds.Command{
9595
return
9696
}
9797

98-
root, err := core.Resolve(req.Context(), nd, p)
98+
root, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, p)
9999
if err != nil {
100100
res.SetError(err, cmds.ErrNormal)
101101
return

core/commands/unixfs/ls.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
merkledag "github.com/ipfs/go-ipfs/merkledag"
1313
path "github.com/ipfs/go-ipfs/path"
1414
unixfs "github.com/ipfs/go-ipfs/unixfs"
15+
uio "github.com/ipfs/go-ipfs/unixfs/io"
1516
unixfspb "github.com/ipfs/go-ipfs/unixfs/pb"
1617
)
1718

@@ -87,7 +88,13 @@ possible, please use 'ipfs ls' instead.
8788

8889
for _, fpath := range paths {
8990
ctx := req.Context()
90-
merkleNode, err := core.Resolve(ctx, node, path.Path(fpath))
91+
92+
resolver := &path.Resolver{
93+
DAG: node.DAG,
94+
ResolveOnce: uio.ResolveUnixfsOnce,
95+
}
96+
97+
merkleNode, err := core.Resolve(ctx, node.Namesys, resolver, path.Path(fpath))
9198
if err != nil {
9299
res.SetError(err, cmds.ErrNormal)
93100
return

core/core.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ import (
6060
pin "github.com/ipfs/go-ipfs/pin"
6161
repo "github.com/ipfs/go-ipfs/repo"
6262
config "github.com/ipfs/go-ipfs/repo/config"
63-
uio "github.com/ipfs/go-ipfs/unixfs/io"
63+
ft "github.com/ipfs/go-ipfs/unixfs"
6464
u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util"
6565
)
6666

@@ -504,7 +504,7 @@ func (n *IpfsNode) loadFilesRoot() error {
504504

505505
switch {
506506
case err == ds.ErrNotFound || val == nil:
507-
nd = uio.NewEmptyDirectory()
507+
nd = ft.EmptyDirNode()
508508
_, err := n.DAG.Add(nd)
509509
if err != nil {
510510
return fmt.Errorf("failure writing to dagstore: %s", err)

core/corehttp/gateway_handler.go

+18-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
dag "github.com/ipfs/go-ipfs/merkledag"
1818
dagutils "github.com/ipfs/go-ipfs/merkledag/utils"
1919
path "github.com/ipfs/go-ipfs/path"
20+
ft "github.com/ipfs/go-ipfs/unixfs"
2021
uio "github.com/ipfs/go-ipfs/unixfs/io"
2122

2223
routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing"
@@ -153,7 +154,13 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
153154
ipnsHostname = true
154155
}
155156

156-
nd, err := core.Resolve(ctx, i.node, path.Path(urlPath))
157+
p, err := path.ParsePath(urlPath)
158+
if err != nil {
159+
webError(w, "Invalid Path Error", err, http.StatusBadRequest)
160+
return
161+
}
162+
163+
nd, err := core.Resolve(ctx, i.node.Namesys, i.node.Resolver, p)
157164
// If node is in offline mode the error code and message should be different
158165
if err == core.ErrNoNamesys && !i.node.OnlineMode() {
159166
w.WriteHeader(http.StatusServiceUnavailable)
@@ -240,8 +247,14 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
240247
return
241248
}
242249

250+
p, err := path.ParsePath(urlPath + "/index.html")
251+
if err != nil {
252+
internalWebError(w, err)
253+
return
254+
}
255+
243256
// return index page instead.
244-
nd, err := core.Resolve(ctx, i.node, path.Path(urlPath+"/index.html"))
257+
nd, err := core.Resolve(ctx, i.node.Namesys, i.node.Resolver, p)
245258
if err != nil {
246259
internalWebError(w, err)
247260
return
@@ -356,7 +369,7 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
356369

357370
var newnode node.Node
358371
if rsegs[len(rsegs)-1] == "QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn" {
359-
newnode = uio.NewEmptyDirectory()
372+
newnode = ft.EmptyDirNode()
360373
} else {
361374
putNode, err := i.newDagFromReader(r.Body)
362375
if err != nil {
@@ -372,7 +385,7 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
372385
}
373386

374387
var newcid *cid.Cid
375-
rnode, err := core.Resolve(ctx, i.node, rootPath)
388+
rnode, err := core.Resolve(ctx, i.node.Namesys, i.node.Resolver, rootPath)
376389
switch ev := err.(type) {
377390
case path.ErrNoLink:
378391
// ev.Node < node where resolve failed
@@ -397,7 +410,7 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
397410
}
398411

399412
e := dagutils.NewDagEditor(pbnd, i.node.DAG)
400-
err = e.InsertNodeAtPath(ctx, newPath, newnode, uio.NewEmptyDirectory)
413+
err = e.InsertNodeAtPath(ctx, newPath, newnode, ft.EmptyDirNode)
401414
if err != nil {
402415
webError(w, "putHandler: InsertNodeAtPath failed", err, http.StatusInternalServerError)
403416
return

core/corerepo/pinning.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,12 @@ import (
2727
func Pin(n *core.IpfsNode, ctx context.Context, paths []string, recursive bool) ([]*cid.Cid, error) {
2828
dagnodes := make([]node.Node, 0)
2929
for _, fpath := range paths {
30-
dagnode, err := core.Resolve(ctx, n, path.Path(fpath))
30+
p, err := path.ParsePath(fpath)
31+
if err != nil {
32+
return nil, err
33+
}
34+
35+
dagnode, err := core.Resolve(ctx, n.Namesys, n.Resolver, p)
3136
if err != nil {
3237
return nil, fmt.Errorf("pin: %s", err)
3338
}

core/coreunix/cat.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
)
1010

1111
func Cat(ctx context.Context, n *core.IpfsNode, pstr string) (*uio.DagReader, error) {
12-
dagNode, err := core.Resolve(ctx, n, path.Path(pstr))
12+
dagNode, err := core.Resolve(ctx, n.Namesys, n.Resolver, path.Path(pstr))
1313
if err != nil {
1414
return nil, err
1515
}

0 commit comments

Comments
 (0)