Skip to content

Commit 65f5dad

Browse files
committed
fix gc after delete history records
Current implementation based on leases.SynchronousDelete only works with the containerd worker and is ignored otherwise. This means that blobs referenced by history records were left on disc until the periodic background GC was initialized later. Signed-off-by: Tonis Tiigi <[email protected]>
1 parent 1a35003 commit 65f5dad

File tree

5 files changed

+37
-21
lines changed

5 files changed

+37
-21
lines changed

cmd/buildkitd/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,7 @@ func newController(c *cli.Context, cfg *config.Config) (*control.Controller, err
850850
LeaseManager: w.LeaseManager(),
851851
ContentStore: w.ContentStore(),
852852
HistoryConfig: cfg.History,
853+
GarbageCollect: w.GarbageCollect,
853854
})
854855
}
855856

control/control.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ type Opt struct {
7070
LeaseManager *leaseutil.Manager
7171
ContentStore *containerdsnapshot.Store
7272
HistoryConfig *config.HistoryConfig
73+
GarbageCollect func(context.Context) error
7374
}
7475

7576
type Controller struct { // TODO: ControlService
@@ -89,10 +90,11 @@ func NewController(opt Opt) (*Controller, error) {
8990
gatewayForwarder := controlgateway.NewGatewayForwarder()
9091

9192
hq, err := llbsolver.NewHistoryQueue(llbsolver.HistoryQueueOpt{
92-
DB: opt.HistoryDB,
93-
LeaseManager: opt.LeaseManager,
94-
ContentStore: opt.ContentStore,
95-
CleanConfig: opt.HistoryConfig,
93+
DB: opt.HistoryDB,
94+
LeaseManager: opt.LeaseManager,
95+
ContentStore: opt.ContentStore,
96+
CleanConfig: opt.HistoryConfig,
97+
GarbageCollect: opt.GarbageCollect,
9698
})
9799
if err != nil {
98100
return nil, errors.Wrap(err, "failed to create history queue")

solver/llbsolver/history.go

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,11 @@ const (
4242
)
4343

4444
type HistoryQueueOpt struct {
45-
DB db.Transactor
46-
LeaseManager *leaseutil.Manager
47-
ContentStore *containerdsnapshot.Store
48-
CleanConfig *config.HistoryConfig
45+
DB db.Transactor
46+
LeaseManager *leaseutil.Manager
47+
ContentStore *containerdsnapshot.Store
48+
CleanConfig *config.HistoryConfig
49+
GarbageCollect func(context.Context) error
4950
}
5051

5152
type HistoryQueue struct {
@@ -323,7 +324,7 @@ func (h *HistoryQueue) gc() error {
323324
now := time.Now()
324325
for _, r := range records[h.opt.CleanConfig.MaxEntries:] {
325326
if now.Add(-h.opt.CleanConfig.MaxAge.Duration).After(r.CompletedAt.AsTime()) {
326-
if err := h.delete(r.Ref, false); err != nil {
327+
if _, err := h.delete(r.Ref); err != nil {
327328
return err
328329
}
329330
}
@@ -365,18 +366,18 @@ func (h *HistoryQueue) clearOrphans() error {
365366

366367
for _, r := range records {
367368
bklog.G(ctx).Warnf("deleting build record %s due to missing blobs", r.Ref)
368-
if err := h.delete(r.Ref, false); err != nil {
369+
if _, err := h.delete(r.Ref); err != nil {
369370
return err
370371
}
371372
}
372373

373374
return nil
374375
}
375376

376-
func (h *HistoryQueue) delete(ref string, sync bool) error {
377+
func (h *HistoryQueue) delete(ref string) (bool, error) {
377378
if _, ok := h.refs[ref]; ok {
378379
h.deleted[ref] = struct{}{}
379-
return nil
380+
return false, nil
380381
}
381382
delete(h.deleted, ref)
382383
h.ps.Send(&controlapi.BuildHistoryEvent{
@@ -389,19 +390,15 @@ func (h *HistoryQueue) delete(ref string, sync bool) error {
389390
return errors.Wrapf(os.ErrNotExist, "failed to retrieve bucket %s", recordsBucket)
390391
}
391392
err1 := b.Delete([]byte(ref))
392-
var opts []leases.DeleteOpt
393-
if sync {
394-
opts = append(opts, leases.SynchronousDelete)
395-
}
396-
err2 := h.hLeaseManager.Delete(context.TODO(), leases.Lease{ID: h.leaseID(ref)}, opts...)
393+
err2 := h.hLeaseManager.Delete(context.TODO(), leases.Lease{ID: h.leaseID(ref)})
397394
if err1 != nil {
398395
return err1
399396
}
400397
return err2
401398
}); err != nil {
402-
return err
399+
return false, err
403400
}
404-
return nil
401+
return true, nil
405402
}
406403

407404
func (h *HistoryQueue) init() error {
@@ -683,7 +680,14 @@ func (h *HistoryQueue) Delete(ctx context.Context, ref string) error {
683680
h.mu.Lock()
684681
defer h.mu.Unlock()
685682

686-
return h.delete(ref, true)
683+
v, err := h.delete(ref)
684+
if err != nil {
685+
return err
686+
}
687+
if v {
688+
return h.opt.GarbageCollect(ctx)
689+
}
690+
return nil
687691
}
688692

689693
func (h *HistoryQueue) OpenBlobWriter(ctx context.Context, mt string) (_ *Writer, err error) {
@@ -909,7 +913,7 @@ func (h *HistoryQueue) Listen(ctx context.Context, req *controlapi.BuildHistoryR
909913
if _, ok := h.deleted[req.Ref]; ok {
910914
if h.refs[req.Ref] == 0 {
911915
delete(h.refs, req.Ref)
912-
h.delete(req.Ref, false)
916+
h.delete(req.Ref)
913917
}
914918
}
915919
h.mu.Unlock()

worker/base/worker.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,14 @@ func NewWorker(ctx context.Context, opt WorkerOpt) (*Worker, error) {
211211
}, nil
212212
}
213213

214+
func (w *Worker) GarbageCollect(ctx context.Context) error {
215+
if w.WorkerOpt.GarbageCollect == nil {
216+
return nil
217+
}
218+
_, err := w.WorkerOpt.GarbageCollect(ctx)
219+
return err
220+
}
221+
214222
func (w *Worker) Close() error {
215223
var rerr error
216224
if err := w.MetadataStore.Close(); err != nil {

worker/worker.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ type Worker interface {
4040
Executor() executor.Executor
4141
CacheManager() cache.Manager
4242
LeaseManager() *leaseutil.Manager
43+
GarbageCollect(context.Context) error
4344
}
4445

4546
type Infos interface {

0 commit comments

Comments
 (0)