From d7af05d6a2564185f03f14d01813de4fe1682914 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 16 Feb 2017 20:39:37 -0500 Subject: [PATCH] Refactor EnumerateChildren to avoid need for bestEffort parameter. License: MIT Signed-off-by: Kevin Atkinson --- core/commands/pin.go | 2 +- core/coreunix/add_test.go | 2 +- merkledag/merkledag.go | 11 +++++------ merkledag/merkledag_test.go | 4 ++-- pin/gc/gc.go | 18 +++++++++++++----- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/core/commands/pin.go b/core/commands/pin.go index b23e89e8d8fc..3c01fa546630 100644 --- a/core/commands/pin.go +++ b/core/commands/pin.go @@ -327,7 +327,7 @@ func pinLsAll(typeStr string, ctx context.Context, n *core.IpfsNode) (map[string if typeStr == "indirect" || typeStr == "all" { set := cid.NewSet() for _, k := range n.Pinning.RecursiveKeys() { - err := dag.EnumerateChildren(n.Context(), n.DAG, k, set.Visit, false) + err := dag.EnumerateChildren(n.Context(), n.DAG.GetLinks, k, set.Visit) if err != nil { return nil, err } diff --git a/core/coreunix/add_test.go b/core/coreunix/add_test.go index 57502d7b974b..90677f341caf 100644 --- a/core/coreunix/add_test.go +++ b/core/coreunix/add_test.go @@ -163,7 +163,7 @@ func TestAddGCLive(t *testing.T) { defer cancel() set := cid.NewSet() - err = dag.EnumerateChildren(ctx, node.DAG, last, set.Visit, false) + err = dag.EnumerateChildren(ctx, node.DAG.GetLinks, last, set.Visit) if err != nil { t.Fatal(err) } diff --git a/merkledag/merkledag.go b/merkledag/merkledag.go index 2daf0c676f07..7a7ed5e90c61 100644 --- a/merkledag/merkledag.go +++ b/merkledag/merkledag.go @@ -370,17 +370,16 @@ func (t *Batch) Commit() error { // EnumerateChildren will walk the dag below the given root node and add all // unseen children to the passed in set. // TODO: parallelize to avoid disk latency perf hits? -func EnumerateChildren(ctx context.Context, ds LinkService, root *cid.Cid, visit func(*cid.Cid) bool, bestEffort bool) error { - links, err := ds.GetLinks(ctx, root) - if bestEffort && err == ErrNotFound { - return nil - } else if err != nil { +type GetLinks func(context.Context, *cid.Cid) ([]*node.Link, error) +func EnumerateChildren(ctx context.Context, getLinks GetLinks, root *cid.Cid, visit func(*cid.Cid) bool) error { + links, err := getLinks(ctx, root) + if err != nil { return err } for _, lnk := range links { c := lnk.Cid if visit(c) { - err = EnumerateChildren(ctx, ds, c, visit, bestEffort) + err = EnumerateChildren(ctx, getLinks, c, visit) if err != nil { return err } diff --git a/merkledag/merkledag_test.go b/merkledag/merkledag_test.go index bd310469fc4a..ee9c52658baf 100644 --- a/merkledag/merkledag_test.go +++ b/merkledag/merkledag_test.go @@ -248,7 +248,7 @@ func TestFetchGraph(t *testing.T) { offline_ds := NewDAGService(bs) - err = EnumerateChildren(context.Background(), offline_ds, root.Cid(), func(_ *cid.Cid) bool { return true }, false) + err = EnumerateChildren(context.Background(), offline_ds.GetLinks, root.Cid(), func(_ *cid.Cid) bool { return true }) if err != nil { t.Fatal(err) } @@ -265,7 +265,7 @@ func TestEnumerateChildren(t *testing.T) { } set := cid.NewSet() - err = EnumerateChildren(context.Background(), ds, root.Cid(), set.Visit, false) + err = EnumerateChildren(context.Background(), ds.GetLinks, root.Cid(), set.Visit) if err != nil { t.Fatal(err) } diff --git a/pin/gc/gc.go b/pin/gc/gc.go index 2c99cb502e15..91bdde2990a8 100644 --- a/pin/gc/gc.go +++ b/pin/gc/gc.go @@ -9,6 +9,7 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) var log = logging.Logger("gc") @@ -68,12 +69,12 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. return output, nil } -func Descendants(ctx context.Context, ls dag.LinkService, set *cid.Set, roots []*cid.Cid, bestEffort bool) error { +func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []*cid.Cid) error { for _, c := range roots { set.Add(c) // EnumerateChildren recursively walks the dag and adds the keys to the given set - err := dag.EnumerateChildren(ctx, ls, c, set.Visit, bestEffort) + err := dag.EnumerateChildren(ctx, getLinks, c, set.Visit) if err != nil { return err } @@ -86,12 +87,19 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. gcs := cid.NewSet() - err := Descendants(ctx, ls, gcs, pn.RecursiveKeys(), false) + err := Descendants(ctx, ls.GetLinks, gcs, pn.RecursiveKeys()) if err != nil { return nil, err } - err = Descendants(ctx, ls, gcs, bestEffortRoots, true) + bestEffortGetLinks := func(ctx context.Context, cid *cid.Cid) ([]*node.Link, error) { + links, err := ls.GetLinks(ctx, cid) + if err == dag.ErrNotFound { + err = nil + } + return links, err + } + err = Descendants(ctx, bestEffortGetLinks, gcs, bestEffortRoots) if err != nil { return nil, err } @@ -100,7 +108,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo gcs.Add(k) } - err = Descendants(ctx, ls, gcs, pn.InternalPins(), false) + err = Descendants(ctx, ls.GetLinks, gcs, pn.InternalPins()) if err != nil { return nil, err }