Treat sandboxes as root gc resources and scan referenced objects

Signed-off-by: Henry Wang <henwang@amazon.com>
This commit is contained in:
Henry Wang 2023-02-27 19:28:28 +00:00
parent 2be87c1a75
commit cf46d3c6fc
2 changed files with 28 additions and 0 deletions

View File

@ -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) c.active(ns, fn)
} }
return cerr return cerr

View File

@ -101,6 +101,9 @@ func TestGCRoots(t *testing.T) {
addLeaseContent("ns3", "l1", dgst(1)), addLeaseContent("ns3", "l1", dgst(1)),
addLeaseSnapshot("ns3", "l1", "overlay", "sn1"), addLeaseSnapshot("ns3", "l1", "overlay", "sn1"),
addLeaseIngest("ns3", "l1", "ingest-1"), addLeaseIngest("ns3", "l1", "ingest-1"),
addSandbox("ns3", "sandbox1", nil),
addSandbox("ns4", "sandbox1", labelmap(string(labelGCSnapRef)+"overlay", "sn1")),
} }
expected := []gc.Node{ expected := []gc.Node{
@ -136,6 +139,7 @@ func TestGCRoots(t *testing.T) {
gcnode(ResourceIngest, "ns3", "ingest-1"), gcnode(ResourceIngest, "ns3", "ingest-1"),
gcnode(resourceContentFlat, "ns3", dgst(1).String()), gcnode(resourceContentFlat, "ns3", dgst(1).String()),
gcnode(resourceSnapshotFlat, "ns3", "overlay/sn1"), gcnode(resourceSnapshotFlat, "ns3", "overlay/sn1"),
gcnode(ResourceSnapshot, "ns4", "overlay/sn1"),
} }
if err := db.Update(func(tx *bolt.Tx) error { 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) { func createBuckets(bkt *bolt.Bucket, names ...string) (*bolt.Bucket, error) {
for _, name := range names { for _, name := range names {
nbkt, err := bkt.CreateBucketIfNotExists([]byte(name)) nbkt, err := bkt.CreateBucketIfNotExists([]byte(name))