From 76aa2070021787ed8f2319e15960b709b3266736 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson <k@kevina.org> Date: Mon, 20 Jun 2016 17:06:04 -0400 Subject: [PATCH] Add Files API root as best-effort pin. Closes #2697. Closes #2698. License: MIT Signed-off-by: Kevin Atkinson <k@kevina.org> --- gc/gc.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/gc/gc.go b/gc/gc.go index 1a043c8..34906ff 100644 --- a/gc/gc.go +++ b/gc/gc.go @@ -17,18 +17,19 @@ var log = logging.Logger("gc") // GC performs a mark and sweep garbage collection of the blocks in the blockstore // first, it creates a 'marked' set and adds to it the following: // - all recursively pinned blocks, plus all of their descendants (recursively) +// - bestEffortRoots, plus all of its descendants (recursively) // - all directly pinned blocks // - all blocks utilized internally by the pinner // // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. -func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key.Key, error) { +func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner, bestEffortRoots []key.Key) (<-chan key.Key, error) { unlocker := bs.GCLock() bsrv := bserv.New(bs, offline.Exchange(bs)) ds := dag.NewDAGService(bsrv) - gcs, err := ColoredSet(ctx, pn, ds) + gcs, err := ColoredSet(ctx, pn, ds, bestEffortRoots) if err != nil { return nil, err } @@ -69,7 +70,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key. return output, nil } -func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots []key.Key) error { +func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots []key.Key, bestEffort bool) error { for _, k := range roots { set.Add(k) nd, err := ds.Get(ctx, k) @@ -78,7 +79,7 @@ func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots [ } // EnumerateChildren recursively walks the dag and adds the keys to the given set - err = dag.EnumerateChildren(ctx, ds, nd, set) + err = dag.EnumerateChildren(ctx, ds, nd, set, bestEffort) if err != nil { return err } @@ -87,11 +88,16 @@ func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots [ return nil } -func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService) (key.KeySet, error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService, bestEffortRoots []key.Key) (key.KeySet, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. gcs := key.NewKeySet() - err := Descendants(ctx, ds, gcs, pn.RecursiveKeys()) + err := Descendants(ctx, ds, gcs, pn.RecursiveKeys(), false) + if err != nil { + return nil, err + } + + err = Descendants(ctx, ds, gcs, bestEffortRoots, true) if err != nil { return nil, err } @@ -100,7 +106,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService) (key.KeyS gcs.Add(k) } - err = Descendants(ctx, ds, gcs, pn.InternalPins()) + err = Descendants(ctx, ds, gcs, pn.InternalPins(), false) if err != nil { return nil, err } -- GitLab