Skip to content

Commit 9dd9f64

Browse files
authored
Merge pull request moby#5515 from tonistiigi/history-gc-sync-fix
fix gc after delete history records
2 parents 9a33f71 + 65f5dad commit 9dd9f64

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)