Skip to content

Commit 08f342e

Browse files
committed
Pass cids instead of nodes around in EnumerateChildrenAsync
License: MIT Signed-off-by: Iaroslav Gridin <[email protected]>
1 parent 4028e89 commit 08f342e

File tree

1 file changed

+35
-40
lines changed

1 file changed

+35
-40
lines changed

merkledag/merkledag.go

+35-40
Original file line numberDiff line numberDiff line change
@@ -394,56 +394,51 @@ func EnumerateChildren(ctx context.Context, ds LinkService, root *cid.Cid, visit
394394
var FetchGraphConcurrency = 8
395395

396396
func EnumerateChildrenAsync(ctx context.Context, ds DAGService, c *cid.Cid, visit func(*cid.Cid) bool) error {
397-
if !visit(c) {
398-
return nil
399-
}
400-
401-
root, err := ds.Get(ctx, c)
402-
if err != nil {
403-
return err
404-
}
405-
406-
feed := make(chan node.Node)
407-
out := make(chan *NodeOption)
397+
feed := make(chan *cid.Cid)
398+
out := make(chan node.Node)
408399
done := make(chan struct{})
409400

410401
var setlk sync.Mutex
411-
402+
403+
errChan := make(chan error)
404+
fetchersCtx, cancel := context.WithCancel(ctx)
405+
406+
defer cancel()
407+
412408
for i := 0; i < FetchGraphConcurrency; i++ {
413409
go func() {
414-
for n := range feed {
415-
links := n.Links()
416-
cids := make([]*cid.Cid, 0, len(links))
417-
for _, l := range links {
418-
setlk.Lock()
419-
unseen := visit(l.Cid)
420-
setlk.Unlock()
421-
if unseen {
422-
cids = append(cids, l.Cid)
423-
}
410+
for ic := range feed {
411+
n, err := ds.Get(ctx, ic)
412+
if err != nil {
413+
errChan <- err
414+
return
424415
}
425-
426-
for nopt := range ds.GetMany(ctx, cids) {
416+
417+
setlk.Lock()
418+
unseen := visit(ic)
419+
setlk.Unlock()
420+
421+
if unseen {
427422
select {
428-
case out <- nopt:
429-
case <-ctx.Done():
423+
case out <- n:
424+
case <-fetchersCtx.Done():
430425
return
431426
}
432427
}
433428
select {
434429
case done <- struct{}{}:
435-
case <-ctx.Done():
430+
case <-fetchersCtx.Done():
436431
}
437432
}
438433
}()
439434
}
440435
defer close(feed)
441436

442437
send := feed
443-
var todobuffer []node.Node
438+
var todobuffer []*cid.Cid
444439
var inProgress int
445440

446-
next := root
441+
next := c
447442
for {
448443
select {
449444
case send <- next:
@@ -460,18 +455,18 @@ func EnumerateChildrenAsync(ctx context.Context, ds DAGService, c *cid.Cid, visi
460455
if inProgress == 0 && next == nil {
461456
return nil
462457
}
463-
case nc := <-out:
464-
if nc.Err != nil {
465-
return nc.Err
466-
}
467-
468-
if next == nil {
469-
next = nc.Node
470-
send = feed
471-
} else {
472-
todobuffer = append(todobuffer, nc.Node)
458+
case nd := <-out:
459+
for _, lnk := range nd.Links() {
460+
if next == nil {
461+
next = lnk.Cid
462+
send = feed
463+
} else {
464+
todobuffer = append(todobuffer, lnk.Cid)
465+
}
473466
}
474-
467+
case err := <-errChan:
468+
return err
469+
475470
case <-ctx.Done():
476471
return ctx.Err()
477472
}

0 commit comments

Comments
 (0)