Skip to content

Commit 07683a7

Browse files
committed
iterator technique for unixfs dir listing
License: MIT Signed-off-by: Jeromy <[email protected]>
1 parent 944f07f commit 07683a7

File tree

3 files changed

+26
-12
lines changed

3 files changed

+26
-12
lines changed

mfs/dir.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,5 +433,5 @@ func (d *Directory) GetNode() (node.Node, error) {
433433
return nil, err
434434
}
435435

436-
return nd, err
436+
return nd.Copy(), err
437437
}

unixfs/hamt/hamt.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func NewHamtFromDag(dserv dag.DAGService, nd node.Node) (*HamtShard, error) {
8383
}
8484

8585
ds := makeHamtShard(dserv, int(pbd.GetFanout()))
86-
ds.nd = pbnd.Copy()
86+
ds.nd = pbnd.Copy().(*dag.ProtoNode)
8787
ds.children = make([]child, len(pbnd.Links()))
8888
ds.bitfield = new(big.Int).SetBytes(pbd.GetData())
8989
ds.hashFunc = pbd.GetHashType()
@@ -321,22 +321,24 @@ func (ds *HamtShard) getValue(ctx context.Context, hv *hashBits, key string, cb
321321

322322
func (ds *HamtShard) EnumLinks() ([]*node.Link, error) {
323323
var links []*node.Link
324-
err := ds.walkTrie(func(sv *shardValue) error {
324+
err := ds.ForEachLink(func(l *node.Link) error {
325+
links = append(links, l)
326+
return nil
327+
})
328+
return links, err
329+
}
330+
331+
func (ds *HamtShard) ForEachLink(f func(*node.Link) error) error {
332+
return ds.walkTrie(func(sv *shardValue) error {
325333
lnk, err := node.MakeLink(sv.val)
326334
if err != nil {
327335
return err
328336
}
329337

330338
lnk.Name = sv.key
331339

332-
links = append(links, lnk)
333-
return nil
340+
return f(lnk)
334341
})
335-
if err != nil {
336-
return nil, err
337-
}
338-
339-
return links, nil
340342
}
341343

342344
func (ds *HamtShard) walkTrie(cb func(*shardValue) error) error {

unixfs/io/dirbuilder.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
hamt "github.com/ipfs/go-ipfs/unixfs/hamt"
1111

1212
node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node"
13-
cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid"
1413
)
1514

1615
// ShardSplitThreshold specifies how large of an unsharded directory
@@ -51,7 +50,7 @@ func NewDirectoryFromNode(dserv mdag.DAGService, nd node.Node) (*Directory, erro
5150
case format.TDirectory:
5251
return &Directory{
5352
dserv: dserv,
54-
dirnode: pbnd.Copy(),
53+
dirnode: pbnd.Copy().(*mdag.ProtoNode),
5554
}, nil
5655
case format.THAMTShard:
5756
shard, err := hamt.NewHamtFromDag(dserv, nd)
@@ -103,6 +102,19 @@ func (d *Directory) switchToSharding(ctx context.Context) error {
103102
return nil
104103
}
105104

105+
func (d *Directory) ForEachLink(f func(*node.Link) error) error {
106+
if d.shard == nil {
107+
for _, l := range d.dirnode.Links() {
108+
if err := f(l); err != nil {
109+
return err
110+
}
111+
}
112+
return nil
113+
}
114+
115+
return d.shard.ForEachLink(f)
116+
}
117+
106118
func (d *Directory) Links() ([]*node.Link, error) {
107119
if d.shard == nil {
108120
return d.dirnode.Links(), nil

0 commit comments

Comments
 (0)