Skip to content

Commit 1a654df

Browse files
committed
refactor: add UseCumulativeSize to UnixfsLs instead
1 parent 237e491 commit 1a654df

File tree

6 files changed

+29
-50
lines changed

6 files changed

+29
-50
lines changed

core/coreapi/unixfs.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,10 @@ func (api *UnixfsAPI) processLink(ctx context.Context, linkres ft.LinkResult, se
271271
lnk.Type = coreiface.TFile
272272
lnk.Size = linkres.Link.Size
273273
case cid.DagProtobuf:
274+
if settings.UseCumulativeSize {
275+
lnk.Size = linkres.Link.Size
276+
}
277+
274278
if !settings.ResolveChildren {
275279
break
276280
}
@@ -296,7 +300,9 @@ func (api *UnixfsAPI) processLink(ctx context.Context, linkres ft.LinkResult, se
296300
lnk.Type = coreiface.TSymlink
297301
lnk.Target = string(d.Data())
298302
}
299-
lnk.Size = d.FileSize()
303+
if !settings.UseCumulativeSize {
304+
lnk.Size = d.FileSize()
305+
}
300306
}
301307
}
302308

core/corehttp/gateway_handler_unixfs_dir.go

Lines changed: 16 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,9 @@ import (
1111
"github.com/dustin/go-humanize"
1212
cid "github.com/ipfs/go-cid"
1313
files "github.com/ipfs/go-ipfs-files"
14-
format "github.com/ipfs/go-ipld-format"
15-
merkledag "github.com/ipfs/go-merkledag"
1614
path "github.com/ipfs/go-path"
1715
"github.com/ipfs/go-path/resolver"
18-
"github.com/ipfs/go-unixfs"
19-
"github.com/ipfs/go-unixfs/hamt"
16+
options "github.com/ipfs/interface-go-ipfs-core/options"
2017
ipath "github.com/ipfs/interface-go-ipfs-core/path"
2118
"github.com/ipfs/kubo/assets"
2219
"github.com/ipfs/kubo/tracing"
@@ -108,17 +105,26 @@ func (i *gatewayHandler) serveDirectory(ctx context.Context, w http.ResponseWrit
108105
return
109106
}
110107

111-
// Optimization: use Dag.Get to fetch the children links of this directory
112-
// instead of UnixFS.LS. Dag.Get is faster and also provides a Size field
113-
// that is good enough for a directory listing.
114-
links, err := i.getUnixFsLinks(ctx, resolvedPath.Cid())
108+
// Optimization: use Unixfs.Ls without resolving children, but using the
109+
// cumulative DAG size as the file size. This allows for a fast listing
110+
// while keeping a good enough Size field.
111+
results, err := i.api.Unixfs().Ls(ctx,
112+
resolvedPath,
113+
options.Unixfs.ResolveChildren(false),
114+
options.Unixfs.UseCumulativeSize(true),
115+
)
115116
if err != nil {
116117
internalWebError(w, err)
117118
return
118119
}
119120

120-
dirListing := make([]directoryItem, 0, len(links))
121-
for _, link := range links {
121+
dirListing := make([]directoryItem, 0, len(results))
122+
for link := range results {
123+
if link.Err != nil {
124+
internalWebError(w, err)
125+
return
126+
}
127+
122128
hash := link.Cid.String()
123129
di := directoryItem{
124130
Size: humanize.Bytes(uint64(link.Size)),
@@ -202,36 +208,3 @@ func (i *gatewayHandler) serveDirectory(ctx context.Context, w http.ResponseWrit
202208
func getDirListingEtag(dirCid cid.Cid) string {
203209
return `"DirIndex-` + assets.AssetHash + `_CID-` + dirCid.String() + `"`
204210
}
205-
206-
func (i *gatewayHandler) getUnixFsLinks(ctx context.Context, cid cid.Cid) ([]*format.Link, error) {
207-
obj, err := i.api.Dag().Get(ctx, cid)
208-
if err != nil {
209-
return nil, err
210-
}
211-
212-
protoNode, ok := obj.(*merkledag.ProtoNode)
213-
if !ok {
214-
return obj.Links(), nil
215-
}
216-
217-
fsNode, err := unixfs.FSNodeFromBytes(protoNode.Data())
218-
if err != nil {
219-
return nil, err
220-
}
221-
222-
if fsNode.Type() == unixfs.THAMTShard {
223-
shard, err := hamt.NewHamtFromDag(i.api.Dag(), obj)
224-
if err != nil {
225-
return nil, err
226-
}
227-
228-
links, err := shard.EnumLinks(ctx)
229-
if err != nil {
230-
return nil, err
231-
}
232-
233-
return links, nil
234-
} else {
235-
return obj.Links(), nil
236-
}
237-
}

docs/examples/kubo-as-a-library/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ replace github.com/ipfs/kubo => ./../../..
88

99
require (
1010
github.com/ipfs/go-ipfs-files v0.2.0
11-
github.com/ipfs/interface-go-ipfs-core v0.7.0
11+
github.com/ipfs/interface-go-ipfs-core v0.7.1-0.20221208145217-d5ff04b0800e
1212
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
1313
github.com/libp2p/go-libp2p v0.23.4
1414
github.com/multiformats/go-multiaddr v0.8.0

docs/examples/kubo-as-a-library/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -624,8 +624,8 @@ github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZ
624624
github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvTs=
625625
github.com/ipfs/go-verifcid v0.0.2/go.mod h1:40cD9x1y4OWnFXbLNJYRe7MpNvWlMn3LZAG5Wb4xnPU=
626626
github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o=
627-
github.com/ipfs/interface-go-ipfs-core v0.7.0 h1:7tb+2upz8oCcjIyjo1atdMk+P+u7wPmI+GksBlLE8js=
628-
github.com/ipfs/interface-go-ipfs-core v0.7.0/go.mod h1:lF27E/nnSPbylPqKVXGZghal2hzifs3MmjyiEjnc9FY=
627+
github.com/ipfs/interface-go-ipfs-core v0.7.1-0.20221208145217-d5ff04b0800e h1:paBQ+cqSEN5Vx4S4i4jiBZfpuHZwoLTC2JD+ZXijqeQ=
628+
github.com/ipfs/interface-go-ipfs-core v0.7.1-0.20221208145217-d5ff04b0800e/go.mod h1:X/udt0qeqxXlgv69JQ8g38gWy4LrCyOuav6f7KDoJMo=
629629
github.com/ipld/edelweiss v0.2.0 h1:KfAZBP8eeJtrLxLhi7r3N0cBCo7JmwSRhOJp3WSpNjk=
630630
github.com/ipld/edelweiss v0.2.0/go.mod h1:FJAzJRCep4iI8FOFlRriN9n0b7OuX3T/S9++NpBDmA4=
631631
github.com/ipld/go-car v0.4.0 h1:U6W7F1aKF/OJMHovnOVdst2cpQE5GhmHibQkAixgNcQ=

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ require (
6262
github.com/ipfs/go-unixfs v0.4.1
6363
github.com/ipfs/go-unixfsnode v1.4.0
6464
github.com/ipfs/go-verifcid v0.0.2
65-
github.com/ipfs/interface-go-ipfs-core v0.7.0
65+
github.com/ipfs/interface-go-ipfs-core v0.7.1-0.20221208145217-d5ff04b0800e
6666
github.com/ipld/go-car v0.4.0
6767
github.com/ipld/go-car/v2 v2.4.0
6868
github.com/ipld/go-codec-dagpb v1.4.1

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -650,8 +650,8 @@ github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZ
650650
github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvTs=
651651
github.com/ipfs/go-verifcid v0.0.2/go.mod h1:40cD9x1y4OWnFXbLNJYRe7MpNvWlMn3LZAG5Wb4xnPU=
652652
github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o=
653-
github.com/ipfs/interface-go-ipfs-core v0.7.0 h1:7tb+2upz8oCcjIyjo1atdMk+P+u7wPmI+GksBlLE8js=
654-
github.com/ipfs/interface-go-ipfs-core v0.7.0/go.mod h1:lF27E/nnSPbylPqKVXGZghal2hzifs3MmjyiEjnc9FY=
653+
github.com/ipfs/interface-go-ipfs-core v0.7.1-0.20221208145217-d5ff04b0800e h1:paBQ+cqSEN5Vx4S4i4jiBZfpuHZwoLTC2JD+ZXijqeQ=
654+
github.com/ipfs/interface-go-ipfs-core v0.7.1-0.20221208145217-d5ff04b0800e/go.mod h1:X/udt0qeqxXlgv69JQ8g38gWy4LrCyOuav6f7KDoJMo=
655655
github.com/ipld/edelweiss v0.2.0 h1:KfAZBP8eeJtrLxLhi7r3N0cBCo7JmwSRhOJp3WSpNjk=
656656
github.com/ipld/edelweiss v0.2.0/go.mod h1:FJAzJRCep4iI8FOFlRriN9n0b7OuX3T/S9++NpBDmA4=
657657
github.com/ipld/go-car v0.4.0 h1:U6W7F1aKF/OJMHovnOVdst2cpQE5GhmHibQkAixgNcQ=

0 commit comments

Comments
 (0)