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