master
go 96 lines 2.61 KB
Raw
1 package gc
2
3 import (
4 "context"
5 "testing"
6
7 "github.com/ipfs/boxo/blockservice"
8 "github.com/ipfs/boxo/blockstore"
9 "github.com/ipfs/boxo/exchange/offline"
10 "github.com/ipfs/boxo/ipld/merkledag"
11 mdutils "github.com/ipfs/boxo/ipld/merkledag/test"
12 pin "github.com/ipfs/boxo/pinning/pinner"
13 "github.com/ipfs/boxo/pinning/pinner/dspinner"
14 "github.com/ipfs/go-cid"
15 "github.com/ipfs/go-datastore"
16 dssync "github.com/ipfs/go-datastore/sync"
17 "github.com/multiformats/go-multihash"
18 "github.com/stretchr/testify/require"
19 )
20
21 func TestGC(t *testing.T) {
22 ctx := context.Background()
23
24 ds := dssync.MutexWrap(datastore.NewMapDatastore())
25 bs := blockstore.NewGCBlockstore(blockstore.NewBlockstore(ds), blockstore.NewGCLocker())
26 bserv := blockservice.New(bs, offline.Exchange(bs))
27 dserv := merkledag.NewDAGService(bserv)
28 pinner, err := dspinner.New(ctx, ds, dserv)
29 require.NoError(t, err)
30
31 daggen := mdutils.NewDAGGenerator()
32
33 var expectedKept []multihash.Multihash
34 var expectedDiscarded []multihash.Multihash
35
36 // add some pins
37 for range 5 {
38 // direct
39 root, _, err := daggen.MakeDagNode(dserv.Add, 0, 1)
40 require.NoError(t, err)
41 err = pinner.PinWithMode(ctx, root, pin.Direct, "")
42 require.NoError(t, err)
43 expectedKept = append(expectedKept, root.Hash())
44
45 // recursive
46 root, allCids, err := daggen.MakeDagNode(dserv.Add, 5, 2)
47 require.NoError(t, err)
48 err = pinner.PinWithMode(ctx, root, pin.Recursive, "")
49 require.NoError(t, err)
50 expectedKept = append(expectedKept, toMHs(allCids)...)
51 }
52
53 err = pinner.Flush(ctx)
54 require.NoError(t, err)
55
56 // add more dags to be GCed
57 for range 5 {
58 _, allCids, err := daggen.MakeDagNode(dserv.Add, 5, 2)
59 require.NoError(t, err)
60 expectedDiscarded = append(expectedDiscarded, toMHs(allCids)...)
61 }
62
63 // and some other as "best effort roots"
64 var bestEffortRoots []cid.Cid
65 for range 5 {
66 root, allCids, err := daggen.MakeDagNode(dserv.Add, 5, 2)
67 require.NoError(t, err)
68 bestEffortRoots = append(bestEffortRoots, root)
69 expectedKept = append(expectedKept, toMHs(allCids)...)
70 }
71
72 ch := GC(ctx, bs, ds, pinner, bestEffortRoots)
73 var discarded []multihash.Multihash
74 for res := range ch {
75 require.NoError(t, res.Error)
76 discarded = append(discarded, res.KeyRemoved.Hash())
77 }
78
79 allKeys, err := bs.AllKeysChan(ctx)
80 require.NoError(t, err)
81 var kept []multihash.Multihash
82 for key := range allKeys {
83 kept = append(kept, key.Hash())
84 }
85
86 require.ElementsMatch(t, expectedDiscarded, discarded)
87 require.ElementsMatch(t, expectedKept, kept)
88 }
89
90 func toMHs(cids []cid.Cid) []multihash.Multihash {
91 res := make([]multihash.Multihash, len(cids))
92 for i, c := range cids {
93 res[i] = c.Hash()
94 }
95 return res
96 }