diff --git a/metadata/gc.go b/metadata/gc.go index aba72d56b..5518a4487 100644 --- a/metadata/gc.go +++ b/metadata/gc.go @@ -430,6 +430,20 @@ func (c *gcContext) scanRoots(ctx context.Context, tx *bolt.Tx, nc chan<- gc.Nod } } + bbkt := nbkt.Bucket(bucketKeyObjectSandboxes) + if bbkt != nil { + if err := bbkt.ForEach(func(k, v []byte) error { + if v != nil { + return nil + } + + sbbkt := bbkt.Bucket(k) + return c.sendLabelRefs(ns, sbbkt, fn) + }); err != nil { + return err + } + } + c.active(ns, fn) } return cerr diff --git a/metadata/gc_test.go b/metadata/gc_test.go index 576dc6a91..26508d328 100644 --- a/metadata/gc_test.go +++ b/metadata/gc_test.go @@ -101,6 +101,9 @@ func TestGCRoots(t *testing.T) { addLeaseContent("ns3", "l1", dgst(1)), addLeaseSnapshot("ns3", "l1", "overlay", "sn1"), addLeaseIngest("ns3", "l1", "ingest-1"), + + addSandbox("ns3", "sandbox1", nil), + addSandbox("ns4", "sandbox1", labelmap(string(labelGCSnapRef)+"overlay", "sn1")), } expected := []gc.Node{ @@ -136,6 +139,7 @@ func TestGCRoots(t *testing.T) { gcnode(ResourceIngest, "ns3", "ingest-1"), gcnode(resourceContentFlat, "ns3", dgst(1).String()), gcnode(resourceSnapshotFlat, "ns3", "overlay/sn1"), + gcnode(ResourceSnapshot, "ns4", "overlay/sn1"), } if err := db.Update(func(tx *bolt.Tx) error { @@ -760,6 +764,16 @@ func addContainer(ns, name, snapshotter, snapshot string, labels map[string]stri } } +func addSandbox(ns, name string, labels map[string]string) alterFunc { + return func(bkt *bolt.Bucket) error { + sbkt, err := createBuckets(bkt, ns, string(bucketKeyObjectSandboxes), name) + if err != nil { + return err + } + return boltutil.WriteLabels(sbkt, labels) + } +} + func createBuckets(bkt *bolt.Bucket, names ...string) (*bolt.Bucket, error) { for _, name := range names { nbkt, err := bkt.CreateBucketIfNotExists([]byte(name))