Skip to content

Commit 7fc428c

Browse files
committed
solver: release unreferenced cache keys after gc
Previously this routine only ran after user ran prune command or on reboot of the daemon. Signed-off-by: Tonis Tiigi <[email protected]>
1 parent e853c88 commit 7fc428c

File tree

5 files changed

+42
-8
lines changed

5 files changed

+42
-8
lines changed

control/control.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,15 @@ type Opt struct {
7676

7777
type Controller struct { // TODO: ControlService
7878
// buildCount needs to be 64bit aligned
79-
buildCount int64
80-
opt Opt
81-
solver *llbsolver.Solver
82-
history *llbsolver.HistoryQueue
83-
cache solver.CacheManager
84-
gatewayForwarder *controlgateway.GatewayForwarder
85-
throttledGC func()
86-
gcmu sync.Mutex
79+
buildCount int64
80+
opt Opt
81+
solver *llbsolver.Solver
82+
history *llbsolver.HistoryQueue
83+
cache solver.CacheManager
84+
gatewayForwarder *controlgateway.GatewayForwarder
85+
throttledGC func()
86+
throttledReleaseUnreferenced func()
87+
gcmu sync.Mutex
8788
tracev1.UnimplementedTraceServiceServer
8889
}
8990

@@ -124,6 +125,8 @@ func NewController(opt Opt) (*Controller, error) {
124125
gatewayForwarder: gatewayForwarder,
125126
}
126127
c.throttledGC = throttle.After(time.Minute, c.gc)
128+
// use longer interval for releaseUnreferencedCache deleting links quickly is less important
129+
c.throttledReleaseUnreferenced = throttle.After(5*time.Minute, func() { c.releaseUnreferencedCache(context.TODO()) })
127130

128131
defer func() {
129132
time.AfterFunc(time.Second, c.throttledGC)
@@ -194,6 +197,10 @@ func (c *Controller) DiskUsage(ctx context.Context, r *controlapi.DiskUsageReque
194197
return resp, nil
195198
}
196199

200+
func (c *Controller) releaseUnreferencedCache(ctx context.Context) error {
201+
return c.cache.ReleaseUnreferenced(ctx)
202+
}
203+
197204
func (c *Controller) Prune(req *controlapi.PruneRequest, stream controlapi.Control_PruneServer) error {
198205
if atomic.LoadInt64(&c.buildCount) == 0 {
199206
imageutil.CancelCacheLeases()
@@ -634,6 +641,7 @@ func (c *Controller) gc() {
634641
<-done
635642
if size > 0 {
636643
bklog.G(ctx).Debugf("gc cleaned up %d bytes", size)
644+
go c.throttledReleaseUnreferenced()
637645
}
638646
}
639647

solver/cachemanager.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,13 @@ type cacheManager struct {
4242
}
4343

4444
func (c *cacheManager) ReleaseUnreferenced(ctx context.Context) error {
45+
visited := map[string]struct{}{}
4546
return c.backend.Walk(func(id string) error {
4647
return c.backend.WalkResults(id, func(cr CacheResult) error {
48+
if _, ok := visited[cr.ID]; ok {
49+
return nil
50+
}
51+
visited[cr.ID] = struct{}{}
4752
if !c.results.Exists(ctx, cr.ID) {
4853
c.backend.Release(cr.ID)
4954
}

solver/combinedcache.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,18 @@ func (cm *combinedCacheManager) ID() string {
3333
return cm.id
3434
}
3535

36+
func (cm *combinedCacheManager) ReleaseUnreferenced(ctx context.Context) error {
37+
eg, ctx := errgroup.WithContext(ctx)
38+
for _, c := range cm.cms {
39+
func(c CacheManager) {
40+
eg.Go(func() error {
41+
return c.ReleaseUnreferenced(ctx)
42+
})
43+
}(c)
44+
}
45+
return eg.Wait()
46+
}
47+
3648
func (cm *combinedCacheManager) Query(inp []CacheKeyWithSelector, inputIndex Index, dgst digest.Digest, outputIndex Index) ([]*CacheKey, error) {
3749
eg, _ := errgroup.WithContext(context.TODO())
3850
keys := make(map[string]*CacheKey, len(cm.cms))

solver/llbsolver/bridge.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,13 @@ func (lcm *lazyCacheManager) Save(key *solver.CacheKey, s solver.Result, created
425425
return lcm.main.Save(key, s, createdAt)
426426
}
427427

428+
func (lcm *lazyCacheManager) ReleaseUnreferenced(ctx context.Context) error {
429+
if err := lcm.wait(); err != nil {
430+
return err
431+
}
432+
return lcm.main.ReleaseUnreferenced(ctx)
433+
}
434+
428435
func (lcm *lazyCacheManager) wait() error {
429436
<-lcm.waitCh
430437
return lcm.err

solver/types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,4 +267,6 @@ type CacheManager interface {
267267

268268
// Save saves a result based on a cache key
269269
Save(key *CacheKey, s Result, createdAt time.Time) (*ExportableCacheKey, error)
270+
271+
ReleaseUnreferenced(context.Context) error
270272
}

0 commit comments

Comments
 (0)