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
+}