@cryptotaxi247 / kubo / commits / 5123857c4

break up GC logic

License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>

Jeromy committed Jul 9, 2015 at 16:03 UTC 5123857c4b6f1e8b608638e62a16aa1b4e6c48b8
1 file changed +42 -32
pin/gc/gc.go
+42 -32
@@ -29,38 +29,9 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key.
29 bsrv := bserv.New(bs, offline.Exchange(bs))
30 ds := dag.NewDAGService(bsrv)
31
32 - // KeySet currently implemented in memory, in the future, may be bloom filter or
33 - // disk backed to conserve memory.
34 - gcs := key.NewKeySet()
35 - for _, k := range pn.RecursiveKeys() {
36 - gcs.Add(k)
37 - nd, err := ds.Get(ctx, k)
38 - if err != nil {
39 - return nil, err
40 - }
41 -
42 - // EnumerateChildren recursively walks the dag and adds the keys to the given set
43 - err = dag.EnumerateChildren(ctx, ds, nd, gcs)
44 - if err != nil {
45 - return nil, err
46 - }
47 - }
48 - for _, k := range pn.DirectKeys() {
49 - gcs.Add(k)
50 - }
51 - for _, k := range pn.InternalPins() {
52 - gcs.Add(k)
53 -
54 - nd, err := ds.Get(ctx, k)
55 - if err != nil {
56 - return nil, err
57 - }
58 -
59 - // EnumerateChildren recursively walks the dag and adds the keys to the given set
60 - err = dag.EnumerateChildren(ctx, ds, nd, gcs)
61 - if err != nil {
62 - return nil, err
63 - }
32 + gcs, err := ColoredSet(pn, ds)
33 + if err != nil {
34 + return nil, err
35 }
36
37 keychan, err := bs.AllKeysChan(ctx)
@@ -97,3 +68,42 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key.
68
69 return output, nil
70 }
71 +
72 +func Descendants(ds dag.DAGService, set key.KeySet, roots []key.Key) error {
73 + for _, k := range roots {
74 + set.Add(k)
75 + nd, err := ds.Get(context.Background(), k)
76 + if err != nil {
77 + return err
78 + }
79 +
80 + // EnumerateChildren recursively walks the dag and adds the keys to the given set
81 + err = dag.EnumerateChildren(context.Background(), ds, nd, set)
82 + if err != nil {
83 + return err
84 + }
85 + }
86 +
87 + return nil
88 +}
89 +
90 +func ColoredSet(pn pin.Pinner, ds dag.DAGService) (key.KeySet, error) {
91 + // KeySet currently implemented in memory, in the future, may be bloom filter or
92 + // disk backed to conserve memory.
93 + gcs := key.NewKeySet()
94 + err := Descendants(ds, gcs, pn.RecursiveKeys())
95 + if err != nil {
96 + return nil, err
97 + }
98 +
99 + for _, k := range pn.DirectKeys() {
100 + gcs.Add(k)
101 + }
102 +
103 + err = Color(ds, gcs, pn.InternalPins())
104 + if err != nil {
105 + return nil, err
106 + }
107 +
108 + return gcs, nil
109 +}